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

Должен ли я помещать shebang в мои скрипты Python? В какой форме?

#!/usr/bin/env python 

или

#!/usr/local/bin/python

Являются ли они одинаково переносимыми? Какая форма используется больше всего?

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

Ответ 1

Строка 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"

Ответ 2

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

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

Ответ 3

Должен ли я помещать shebang в мои скрипты Python?

Поместите shebang в Python script, чтобы указать:

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

Являются ли они одинаково переносимыми? Какая форма используется больше всего?

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

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

Другими словами, если script находится в исходной проверке, вы, вероятно, увидите #!/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.

Ответ 4

Если у вас более одной версии Python и script необходимо запустить под определенной версией, она может гарантировать, что правильный используется, когда script выполняется напрямую, например:

#!/usr/bin/python2.7

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

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

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

Ответ 5

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

Ответ 6

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

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

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

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

ТАКЖЕ: он не отличается от Python.

Ответ 7

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

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

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

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

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

Ответ 8

Когда я недавно установил Python 3.6.1 в Windows 7, он также установил Python Launcher для Windows, который должен обрабатывать линию shebang. Однако я обнаружил, что Python Launcher этого не делал: строка shebang была проигнорирована, и всегда использовался Python 2.7.13 (если я не выполнил script с помощью 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" %*

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

Ответ 9

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

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

Начните с проверки правильности используемой строки shebang:

which python

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

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

$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

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

Ответ 10

Если у вас установлены разные модули и вам нужно использовать определенный Python установить, а затем Shebang кажется ограниченным вначале. Тем не мение, Вы можете сделать трюки, подобные приведенным ниже, чтобы позволить вызывать Шебанг сначала в качестве сценария оболочки, а затем выберите Python. Это очень гибкий имо:

#!/bin/sh
#
# Choose the python we need. Explanation:
# a) '''\' translates to \ in shell, and starts a python multi-line string
# b) "" strings are treated as string concat by python, shell ignores them
# c) "true" command ignores its arguments
# c) exit before the ending ''' so the shell reads no further
# d) reset set docstrings to ignore the multiline comment code
#
"true" '''\'
PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    echo Using preferred python $ALTERNATIVE_PYTHON
    exec $PREFERRED_PYTHON "$0" "[email protected]"
elif [ -x $ALTERNATIVE_PYTHON ]; then
    echo Using alternative python $ALTERNATIVE_PYTHON
    exec $ALTERNATIVE_PYTHON "$0" "[email protected]"
else
    echo Using fallback python $FALLBACK_PYTHON
    exec python3 "$0" "[email protected]"
fi
exit 127
'''

__doc__ = """What this file does"""
print(__doc__)
import platform
print(platform.python_version())

Или еще лучше, возможно, для облегчения повторного использования кода в нескольких сценариях Python:

#!/bin/bash
"true" '''\'; source $(cd $(dirname ${BASH_SOURCE[@]}) &>/dev/null && pwd)/select.sh; exec $CHOSEN_PYTHON "$0" "[email protected]"; exit 127; '''

а затем select.sh имеет:

PREFERRED_PYTHON=/Library/Frameworks/Python.framework/Versions/2.7/bin/python
ALTERNATIVE_PYTHON=/Library/Frameworks/Python.framework/Versions/3.6/bin/python3
FALLBACK_PYTHON=python3

if [ -x $PREFERRED_PYTHON ]; then
    CHOSEN_PYTHON=$PREFERRED_PYTHON
elif [ -x $ALTERNATIVE_PYTHON ]; then
    CHOSEN_PYTHON=$ALTERNATIVE_PYTHON
else
    CHOSEN_PYTHON=$FALLBACK_PYTHON
fi

Ответ 11

Используйте сначала

which python

Это даст вывод в качестве места, где присутствует мой интерпретатор Python (двоичный).

Этот вывод может быть любым, например,

/usr/bin/python

или

/bin/python

Теперь выберите строку Шебанга и используйте ее.

Для обобщения мы можем использовать:

#!/usr/bin/env

или

#!/bin/env