Должен ли я поставить #! (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