Должен ли я добавить Шебанг в мои скрипты Python? В какой форме?
#!/usr/bin/env python
или
#!/usr/local/bin/python
Они одинаково портативны? Какая форма используется чаще всего?
Примечание: смерч проект использует хижину. С другой стороны,проект Django этого не делает.
python
shell
python-3.x
shebang
treecoder
источник
источник
#!/usr/bin/python
сравнить с первым вариантом? Я вижу это во многих примерах кода. Редактировать: Может быть, это ответ .. stackoverflow.com/a/2429517/1156245Ответы:
Строка shebang в любом сценарии определяет возможность выполнения сценария как автономный исполняемый файл без
python
предварительного ввода в терминале или двойного щелчка по нему в файловом менеджере (при правильной настройке). В этом нет необходимости, но, как правило, это делается, поэтому, когда кто-то видит файл, открытый в редакторе, он сразу же узнает, на что он смотрит. Тем не менее, что притон линия используется IS важно.Правильное использование для скриптов Python 3:
По умолчанию это версия 3.latest. Для Python 2.7.Последнее использование
python2
вместоpython3
.Следующее НЕ должно использоваться (за исключением редкого случая, когда вы пишете код, совместимый с Python 2.x и 3.x):
Причина этих рекомендаций, приведены в PEP 394 , что
python
может относиться либо кpython2
илиpython3
на разных системах. В настоящее время он относится кpython2
большинству дистрибутивов, но в какой-то момент он может измениться.Кроме того, НЕ используйте:
- "#! / usr / bin / env python" против "#! / usr / local / bin / python"
источник
/usr/bin
то как вы можете быть уверены, чтоenv
он будет найден в/usr/bin
. Если python установлен в нестандартном месте, то это, вероятно, означает, что python настроен нестандартным способом и в результате скрипт должен быстро завершиться с ошибкой. В отличие от предположений о свойствах интерпретатора Python и надежды на лучшее.env
будет всегда можно найти в/usr/bin/
, и его работа состоит в том, чтобы найти контейнеры (например , питон) , используяPATH
. Независимо от того, как установлен python, его путь будет добавлен в эту переменную иenv
найдет его (если нет, python не установлен). Это работаenv
, вот и вся причина, почему она существует. Это то, что предупреждает об окружающей среде (настраивает переменные env, включая пути установки и включают пути). Люди всегда понимали, что эта команда может работать, только если она всегда находится в одном и том же месте. Это просто дано/usr/bin/env
не гарантируется никаким стандартом, кроме широко (повсеместно принятого) принятого правила ...python
исполняемый файл, только когда скрипт совместим с Python 2 и Python 3. В противном случае он должен указывать на соответствующий выбор изpython2
иpython3
.Это действительно просто вопрос вкуса. Добавление shebang означает, что люди могут вызывать скрипт напрямую, если они хотят (при условии, что он помечен как исполняемый); опуская это просто означает,
python
что должен быть вызван вручную.Конечный результат запуска программы не зависит ни в каком случае; это просто варианты средств.
источник
chmod a+x [your-script].py
должно сделать его исполняемым, и тогда вы можете просто вызвать./[your-script.py]
оболочку.Поместите шебанг в скрипт Python, чтобы указать:
python
явного вызова исполняемого файлаЕсли вы пишете шебанг вручную, всегда используйте,
#!/usr/bin/env python
если у вас нет особых причин не использовать его. Эта форма понятна даже в Windows (Python Launcher).Примечание: установленные скрипты должны использовать определенный исполняемый файл python, например,
/usr/bin/python
или/home/me/.virtualenvs/project/bin/python
. Плохо, если какой-то инструмент ломается, если вы активируете virtualenv в своей оболочке. К счастью, в большинстве случаев правильный шебанг создается автоматическиsetuptools
или инструментами вашего дистрибутива (в Windowssetuptools
можно.exe
автоматически генерировать сценарии оболочки ).Другими словами, если скрипт находится в исходной проверке, то вы, вероятно, увидите
#!/usr/bin/env python
. Если он установлен, то shebang - это путь к конкретному исполняемому файлу python, например#!/usr/local/bin/python
(ПРИМЕЧАНИЕ: вы не должны писать пути из последней категории вручную).Для того, чтобы выбрать , следует ли использовать
python
,python2
илиpython3
в притон, см PEP 394 - The «питон» Command на Unix-подобных системах :источник
#!/usr/bin/env python
себя?#!/usr/bin/env python
. Пожалуйста, не предлагайте «всегда использовать»#!/usr/bin/env python
. Это неправильно в 99% случаев (причина, которую вы указали в своем ответе).Если у вас более одной версии Python и сценарий должен работать под определенной версией, она может убедиться, что правильная версия используется при непосредственном выполнении сценария, например:
Обратите внимание, что скрипт все еще может быть запущен через полную командную строку Python или через импорт, и в этом случае она игнорируется. Но для сценариев, запускаемых напрямую, это достойная причина для использования she-bang.
#!/usr/bin/env python
как правило, лучший подход, но это помогает в особых случаях.Обычно было бы лучше создать виртуальную среду Python, и в этом случае универсальный
#!/usr/bin/env python
тип идентифицировал бы правильный экземпляр Python для virtualenv.источник
which
даст вам строку, которая будет работать, точка. Вам не нужно беспокоиться о любой из кишок, чтобы использовать его.Вы должны добавить шебанг, если скрипт предназначен для выполнения. Вам также следует установить скрипт с установочным программным обеспечением, которое изменяет shebang на что-то правильное, чтобы оно работало на целевой платформе. Примерами этого являются distutils и Distribute.
источник
which
автоматически выберет значение по умолчанию, которое используется системными командами и тому подобное. Он универсален, и система направляет его на правильную установку.Цель shebang - чтобы скрипт распознал тип интерпретатора, когда вы хотите выполнить скрипт из оболочки. В основном, и не всегда, вы выполняете сценарии, предоставляя интерпретатор извне. Пример использования:
python-x.x script.py
Это будет работать, даже если у вас нет декларатора shebang.
Почему первый вариант более «переносим», потому что он
/usr/bin/env
содержит вашуPATH
декларацию, которая учитывает все пункты назначения, в которых находятся исполняемые файлы вашей системы.ПРИМЕЧАНИЕ: Торнадо не строго использует шебанги, а Джанго строго не использует. Это зависит от того, как вы выполняете основную функцию вашего приложения.
ТАКЖЕ: это не зависит от Python.
источник
Иногда, если ответ не очень ясен (я имею в виду, что вы не можете решить, да или нет), тогда он не имеет большого значения, и вы можете игнорировать проблему, пока ответ не будет ясным.
#!
Единственная цель для запуска скрипта. 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.источник
Когда я недавно установил 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
. Это все еще имело значениеиз моей предыдущей установки Python 2.7. Я изменил значение этого ключа реестра на
и обработка строки Python Launcher shebang работала, как описано выше.
источник
Если у вас установлены разные модули и вам нужно использовать определенную установку на python, тогда shebang сначала будет ограничен. Тем не менее, вы можете сделать трюки, подобные приведенным ниже, чтобы позволить shebang вызываться сначала как сценарий оболочки, а затем выбрать python. Это очень гибкий имо:
Или еще лучше, возможно, чтобы облегчить повторное использование кода в нескольких скриптах Python:
а затем select.sh имеет:
источник
Ответ: Только если вы планируете сделать это исполняемым скриптом командной строки.
Вот процедура:
Начните с проверки правильной строки shebang для использования:
Возьмите вывод из этого и добавьте его (с символом #!) В первой строке.
В моей системе это выглядит так:
Итак, ваш шебанг будет выглядеть так:
После сохранения он все равно будет работать, как прежде, так как python увидит эту первую строку в качестве комментария.
Чтобы сделать это командой, скопируйте ее, чтобы удалить расширение .py.
Скажите файловой системе, что это будет исполняемый файл:
Чтобы проверить это, используйте:
Лучше всего переместить его куда-нибудь в $ PATH, чтобы все, что вам нужно было ввести, - это само имя файла.
Таким образом, он будет работать везде (без ./ перед именем файла)
источник
Абсолют против логического пути:
Это действительно вопрос о том, должен ли путь к интерпретатору Python быть абсолютным или логическим (
/usr/bin/env
) в отношении переносимости.Встречаясь с другими ответами на этом и других сайтах стека, которые обсуждали проблему в общем виде без поддержки доказательств, я провел по-настоящему, действительно , детальное тестирование и анализ этого вопроса на unix.stackexchange.com . Вместо того, чтобы вставлять этот ответ сюда, я укажу интересующимся сравнительным анализом на этот ответ:
https://unix.stackexchange.com/a/566019/334294
Будучи инженером Linux, моя цель всегда состоит в том, чтобы предоставить наиболее подходящие, оптимизированные хосты для моих клиентов-разработчиков, поэтому вопрос о средах Python был тем, на что мне действительно требовался твердый ответ. Мое мнение после тестирования состояло в том, что логический путь в «челке» был лучшим из (2) вариантов.
источник
Используйте сначала
Это даст вывод в качестве места, где присутствует мой интерпретатор Python (двоичный).
Этот вывод может быть любым, таким как
или
Теперь соответствующим образом выберите линию Шебанга и используйте ее.
Для обобщения мы можем использовать:
или
источник
#!/usr/bin/env
делает правильный выбор для вас.which
команду - она вернет правильную строку для вашей конкретной системы.which python
снова и меняете сценарий, если выходные данные отличаются от текущего shebang