Любая причина не использовать /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 миллионов

Это может означать, что большая часть кода является достаточно старой, чтобы, если рекомендации приведенных выше вопросов были преобладающей мудростью, люди просто не обновляли свои файлы?


Я посмотрел на эти популярные ОС и обнаружил, что все они используют версионные команды:

1 ответ

Когда вы пишете скрипт, вы можете вызывать различные зависимости от конкретной версии Python. Использовать диктовку? Вам нужен как минимум Python 2.7. С использованием async ключевое слово? Вам нужен как минимум Python 3.5.

Когда вы используете #!/usr/bin/env pythonвы ничего не говорите о том, какая версия Python требуется для выполнения вашего скрипта; вы просто говорите: "Используйте любую версию Python, найденную в вашем пути первой". По сути, разработчик не тот человек, чтобы указать шебанг.

Вместо этого пользователь должен установить shebang для пути правильной версии Python в своей системе.

distutils Пакет является хорошим компромиссом здесь. Вы, разработчик, просто поставили #!python в вашем сценарии. При установке скрипта через python setup.py installустановщик заменяет #!python с любым путем на целевом компьютере.

Другие вопросы по тегам