Любая причина не использовать /usr/bin/env python2/python3 явно?
Я часто вижу это наверху .py
файлы:
#!/usr/bin/env python
С неизвестным состоянием настроек ОС по умолчанию, мне интересно, почему это не так:
#!/usr/bin/env python2
#!/usr/bin/env python3
Если большинство ОС предоставляют эту версионную символическую ссылку, разве это не будет лучше?
При поиске я обнаружил PEP 394, в котором говорится, что на данный момент разработчики должны предполагать, python -> python2 -> python2.x
, Это также заявляет, что можно предположить, что версионные эквиваленты, python3
а также python2
, существовать. Так что плохого в том, что вы не оставляете это на волю случая и не получаете этого дополнительного персонажа?
Если нет python2
установлен, потому что ОС поставляется по умолчанию с python -> python3
(например, Arch Linux), я бы предпочел эту проблему при запуске скрипта или программы:
/usr/bin/env: ‘python2’: No such file or directory
Кроме того, эта ошибка намного хуже, особенно для нового пользователя (python
существует, это просто неправильная версия):
File "<stdin>", line 1
print 'Hello world'
^
SyntaxError: Missing parentheses in call to 'print'
Тем не менее, я нахожу последнее гораздо более распространенным. По крайней мере, теперь я знаю некоторые типичные ошибки совместимости достаточно хорошо, чтобы подумать про себя: "О, верно. python
символическая ".
Два вопроса спрашивают, как указать / проверить нужную версию:
Этот вопрос 2010 года предлагает лечение
python
как смыслpython2
а такжеpython3
как требуется, чтобы явно вызватьpython3
,Этот вопрос 2013 года: возможно, подразумевает, что
python3
не следует использовать, потому что не все дистрибутивы поставляются с ним?
Есть ли очевидная причина, по которой я (или python
программисты) не должны использовать версионные env
позвоните, если большинство ОС предоставляют его? Использовать просто python
похоже, обслуживает меньшинство, у которого нет версионной команды, в то же время вызывая путаницу у подавляющего большинства.
Возможно, ответ состоит в том, чтобы использовать версионные команды (я понял это из PEP 394), но не прошло достаточно времени, чтобы увидеть их появление. На сегодняшний день я никогда не видел версии env
позвони... опять же, если получится, я никогда не посмотрю. Если он ломается, он всегда без версии python
линия, так что мои умственные способности, вероятно, искажены!
Некоторые статистические данные о поиске; Мне было любопытно на использование:
#!/usr/bin/env python2
: ~ 210 тыс. Обращений к коду Python#!/usr/bin/env python3
: ~460 тыс.#!/usr/bin/env python
: ~6 миллионов
Это может означать, что большая часть кода является достаточно старой, чтобы, если рекомендации приведенных выше вопросов были преобладающей мудростью, люди просто не обновляли свои файлы?
Я посмотрел на эти популярные ОС и обнаружил, что все они используют версионные команды:
- Ubuntu: Python-минимальный и Python3-минимальный
- арка: питон и питон2
- fedora: python2 и python3
- Debian: те же имена / состояние, что и в Ubuntu
- различные источники предполагают, что OS X использует версионные команды
- Windows: я думаю, есть доказательства того, что Windows имеет версионные команды
1 ответ
Когда вы пишете скрипт, вы можете вызывать различные зависимости от конкретной версии Python. Использовать диктовку? Вам нужен как минимум Python 2.7. С использованием async
ключевое слово? Вам нужен как минимум Python 3.5.
Когда вы используете #!/usr/bin/env python
вы ничего не говорите о том, какая версия Python требуется для выполнения вашего скрипта; вы просто говорите: "Используйте любую версию Python, найденную в вашем пути первой". По сути, разработчик не тот человек, чтобы указать шебанг.
Вместо этого пользователь должен установить shebang для пути правильной версии Python в своей системе.
distutils
Пакет является хорошим компромиссом здесь. Вы, разработчик, просто поставили #!python
в вашем сценарии. При установке скрипта через python setup.py install
установщик заменяет #!python
с любым путем на целевом компьютере.