it-roy-ru.com

Должен ли я поставить #! (Шебанг) ​​в сценариях Python, и какую форму он должен принимать?

Должен ли я добавить Шебанг в мои скрипты Python? В какой форме?

#!/usr/bin/env python 

или же

#!/usr/local/bin/python

Они одинаково портативны? Какая форма используется чаще всего?

Примечание: проект торнадо использует Шебанг. С другой стороны, проект Django этого не делает.

650
treecoder

Строка Shebang в любом сценарии определяет возможность выполнения сценария как автономный исполняемый файл без предварительного ввода python в терминале или двойного щелчка по нему в файловом менеджере (при правильной настройке). В этом нет необходимости, но, как правило, это делается, поэтому, когда кто-то видит файл, открытый в редакторе, он сразу же знает, на что он смотрит. Однако какая строка Шебанга, которую вы используете , ЯВЛЯЕТСЯ важной.

Правильное использование для сценариев Python 3:

#!/usr/bin/env python3

По умолчанию это версия 3.latest. Для Python 2.7.последнее использование python2 вместо python3.

Следующее НЕ должно использоваться (за исключением редкого случая, когда вы пишете код, совместимый с Python 2.x и 3.x):

#!/usr/bin/env python

Причина этих рекомендаций, приведенных в PEP 394 , заключается в том, что python может ссылаться на python2 или python3 в разных системах. В настоящее время он ссылается на python2 в большинстве дистрибутивов, но в какой-то момент он может измениться.

Кроме того, НЕ используйте:

#!/usr/local/bin/python

"В этих случаях python может быть установлен в/usr/bin/python или/bin/python, приведенный выше #! завершится ошибкой".

-- "#!/usr/bin/env python" против "#!/usr/local/bin/python"

897
GlassGhost

Это действительно просто вопрос вкуса. Добавление Shebang означает, что люди могут вызывать сценарий напрямую, если они хотят (при условии, что он помечен как исполняемый); его пропуск просто означает, что python должен быть вызван вручную.

Конечный результат запуска программы не зависит ни в каком случае; это просто варианты средств.

67
Amber

Должен ли я добавить Шебанг в мои Python сценарии?

Поместите Shebang в скрипт Python, чтобы указать:

  • этот модуль можно запустить как скрипт
  • может ли он быть запущен только на python2, python3 или Python совместим с 2/3
  • в POSIX это необходимо, если вы хотите запустить скрипт напрямую, без явного вызова исполняемого файла python

Они одинаково портативны? Какая форма используется чаще всего?

Если вы пишете Шебанг вручную , то всегда используйте #!/usr/bin/env python, если у вас нет особых причин не использовать его. Эта форма понятна даже в Windows (Python Launcher).

Примечание: установленные сценарии должны использовать определенный исполняемый файл python, например, /usr/bin/python или /home/me/.virtualenvs/project/bin/python. Плохо, если какой-то инструмент ломается, если вы активируете virtualenv в своей оболочке. К счастью, правильный Shebang создается автоматически в большинстве случаев с помощью setuptools или инструментов вашего дистрибутива (в Windows setuptools может автоматически генерировать сценарии оболочки .exe).

Другими словами, если скрипт находится в исходной проверке, вы, вероятно, увидите #!/usr/bin/env python. Если он установлен, то Shebang - это путь к конкретному исполняемому файлу python, например #!/usr/local/bin/python (ПРИМЕЧАНИЕ: вы не должны писать пути из последней категории вручную).

Чтобы выбрать, следует ли вам использовать python, python2 или python3 в Shebang, см. PEP 394 - Команда "python" в Unix-подобных системах :

  • ... python следует использовать в строке Shebang только для сценариев, которые совместимы по источнику с Python 2 и 3.

  • при подготовке к возможному изменению версии Python по умолчанию только Python 2 должны быть либо обновлены, чтобы быть совместимыми с исходным кодом Python 3, либо использовать python2 в строке Shebang.

25
jfs

Если у вас более одной версии Python и ​​сценарий должен работать под определенной версией, она может убедиться, что правильная версия используется при непосредственном выполнении сценария, например:

#!/usr/bin/python2.7

Обратите внимание, что сценарий все еще может быть запущен через полную командную строку Python или через импорт, и в этом случае она игнорируется Но для сценариев, запускаемых напрямую, это достойная причина для использования she-bang.

#!/usr/bin/env python, как правило, лучше, но это помогает в особых случаях.

Обычно было бы лучше создать виртуальную среду Python, и в этом случае универсальный #!/usr/bin/env python идентифицировал бы правильный экземпляр Python для virtualenv.

15
Chris Johnson

Вы должны добавить Shebang, если скрипт предназначен для выполнения. Вам также следует установить скрипт с установочным программным обеспечением, которое изменяет Shebang на что-то правильное, чтобы оно работало на целевой платформе. Примеры этого - distutils и Distribute.

10
Lennart Regebro

Цель Shebang - чтобы скрипт распознал тип интерпретатора, когда вы хотите выполнить скрипт из командной консоли. В основном, и не всегда, вы выполняете сценарии, предоставляя интерпретатор извне. Пример использования: python-x.x script.py

Это будет работать, даже если у вас нет декларатора Shebang.

Почему первый вариант является более "переносимым", потому что /usr/bin/env содержит ваше объявление PATH, которое учитывает все пункты назначения, в которых находятся исполняемые файлы вашей системы.

ПРИМЕЧАНИЕ: Торнадо не строго использует шебанги, а Django строго не использует. Это зависит от того, как вы выполняете основную функцию вашего приложения.

ТАКЖЕ: это не зависит от Python.

9
meson10

Иногда, если ответ не очень ясен (я имею в виду, что вы не можете решить, да или нет), тогда он не имеет большого значения, и вы можете игнорировать проблему, пока ответ is clear.

Единственная цель #! - запуск скрипта. Django загружает источники самостоятельно и использует их. Никогда не нужно решать, какой переводчик следует использовать. Таким образом, #! здесь на самом деле не имеет смысла.

Как правило, если это модуль и его нельзя использовать в качестве сценария, нет необходимости использовать #!. С другой стороны, источник модуля часто содержит if __== '__main__': ... по крайней мере с некоторым тривиальным тестированием функциональности. Тогда #! снова имеет смысл.

Одна из веских причин для использования #! заключается в том, что вы используете оба сценария Python 2 и Python 3 - они должны интерпретироваться различными версиями Python. Таким образом, вы должны помнить, что python нужно использовать при запуске скрипта вручную (без #! внутри). Если у вас есть смесь таких сценариев, рекомендуется использовать внутри #!, сделать их исполняемыми и запустить их как исполняемые файлы (chmod ...).

При использовании MS-Windows #! не имел смысла - до недавнего времени. Python 3.3 представляет Windows Python Launcher (py.exe и pyw.exe), который читает строку #!, обнаруживает установленные версии Python и использует правильную или явно требуемую версию Python. Поскольку расширение может быть связано с программой, вы можете получить такое же поведение в Windows, как и с флагом выполнения в системах на основе Unix.

7
pepr

Когда я недавно установил Python 3.6.1 в Windows 7, он также установил Python Launcher для Windows, который должен обрабатывать строку Shebang. Однако я обнаружил, что средство запуска Python этого не делало: строка Шебанга игнорировалась и всегда использовался Python 2.7.13 (если я не выполнял сценарий с использованием py -3).

Чтобы это исправить, мне пришлось отредактировать ключ реестра Windows HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Python.File\Shell\open\command. Это все еще имело значение

"C:\Python27\python.exe" "%1" %*

из моей более ранней Python 2.7 установки. Я изменил значение этого ключа реестра на

"C:\Windows\py.exe" "%1" %*

и обработка строки Python Launcher Shebang работала, как описано выше.

3
ETalbot

Ответ: Только если вы планируете сделать это исполняемым скриптом командной строки.

Вот процедура:

Начните с проверки правильности строки Шебанга для использования:

which python

Возьмите вывод из этого и добавьте его (с Shebang #!) В первой строке.

В моей системе это выглядит так:

$which python
/usr/bin/python

Так что ваш Шебанг будет выглядеть так:

#!/usr/bin/python

После сохранения он все равно будет работать, как и раньше, поскольку python увидит эту первую строку в качестве комментария.

python filename.py

Чтобы сделать это командой, скопируйте ее, чтобы удалить расширение .py.

cp filename.py filename

Сообщите файловой системе, что это будет исполняемый файл:

chmod +x filename

Чтобы проверить это, используйте:

./filename

Лучше всего переместить его куда-нибудь в $ PATH, чтобы все, что вам нужно было ввести, - это само имя файла.

Sudo cp filename /usr/sbin

Таким образом, он будет работать везде (без ./ перед именем файла)

1
SDsolar