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

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

#!/usr/bin/env python 

или

#!/usr/local/bin/python

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

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

Ответы [ 10 ]

919 голосов
/ 10 октября 2013

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

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

#!/usr/bin/env python3

По умолчанию используется версия 3.самый последний.Для 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 "vs" #! / usr / local / bin / python "

68 голосов
/ 02 августа 2011

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

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

26 голосов
/ 12 августа 2015

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

Вставьте шебанг в скрипт Python, чтобы указать:

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

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

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

Примечание: установленные сценарии должны использовать определенный исполняемый файл 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.

15 голосов
/ 10 августа 2013

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

#!/usr/bin/python2.7

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

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

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

10 голосов
/ 02 августа 2011

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

9 голосов
/ 02 августа 2011

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

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

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

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

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

8 голосов
/ 30 января 2013

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

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

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

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

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

3 голосов
/ 02 июня 2017

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

0 голосов
/ 22 января 2017

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

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

Начните с проверки правильности используемой строки 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

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

0 голосов
/ 21 декабря 2016

Использовать сначала

which python

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

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

/usr/bin/python

или

/bin/python

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

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

#!/usr/bin/env

или

#!/bin/env
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...