Я должен поставить #! (shebang) в скриптах Python, и какую форму он должен принимать?
Я должен положить в мой набор скриптов Python? В какой форме?
#!/usr/bin/env python
или
#!/usr/local/bin/python
они одинаково портативны? Какая форма используется больше всего?
Примечание: the торнадо проект использует shebang. С другой стороны,Джанго нет.
10 ответов:
строка shebang в любом скрипте определяет способность скрипта выполняться как автономный исполняемый файл без ввода
pythonпредварительно в терминале или при двойном щелчке по нему в файловом менеджере (при правильной настройке). Это не обязательно, но обычно помещается туда, поэтому, когда кто-то видит файл, открытый в Редакторе, они сразу знают, на что они смотрят. Однако, какую линию shebang вы используете и важно.правильно использование для скриптов 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илиpython3on различная система. В настоящее время это относится кpython2на большинстве дистрибутивов, но это, вероятно, изменится в какой-то момент.кроме того, не используйте:
#!/usr/local/bin/python"python может быть установлен в /usr / bin / python или /bin / python в тех случаи, описанные выше #! потерпеть неудачу."
--"#!/usr / bin / env python "vs"#!/usr / local/bin / python"
Это действительно просто дело вкуса. Добавление shebang означает, что люди могут вызывать скрипт напрямую, если они хотят (предполагая, что он помечен как исполняемый); опуская его просто означает
pythonдолжен быть вызван вручную.конечный результат выполнения программы не влияет в любом случае, это просто варианты средств.
я должен положить в мой набор скриптов Python?
поместите shebang в скрипт Python, чтобы указать:
- этот модуль может быть запущен как скрипт
- может ли он быть запущен только на python2, python3 или он совместим с Python 2/3
- в POSIX, это необходимо, если вы хотите запустить скрипт напрямую без вызова
pythonисполняемый явноэто одинаково портативный? Какая форма используется больше всего?
если вы пишете shebang вручную тогда всегда используйте
#!/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в притон, см. PEP 394-команда "python" в Unix-подобных системах:
...
pythonдолжен использоваться в строке shebang только для скриптов, которые источник совместим с Python 2 и 3.в рамках подготовки к возможному изменению по умолчанию версия Python, Python 2 только скрипты должны быть обновлены, чтобы быть источником совместим с Python 3 или еще использовать
python2в линии shebang.
Если у вас есть несколько версий Python и скрипт должен работать под определенной версией, она-bang может гарантировать, что правильный используется, когда скрипт выполняется напрямую, например:
#!/usr/bin/python2.7обратите внимание, что скрипт все еще может быть запущен через полную командную строку Python или через импорт, и в этом случае она-bang игнорируется. Но для скриптов, запускаемых напрямую, это достойная причина использовать she-bang.
#!/usr/bin/env pythonкак правило, лучший подход, но это помогает в особых случаях.обычно было бы лучше установить виртуальную среду Python, и в этом случае generic
#!/usr/bin/env pythonопределит правильный экземпляр Python для virtualenv.
вы должны добавить shebang, если скрипт предназначен для выполнения. Вы также должны установить скрипт с установочным программным обеспечением, которое изменяет shebang на что-то правильное, чтобы он работал на целевой платформе. Примеры этого-distutils и Distribute.
цель shebang заключается в том, чтобы скрипт распознал тип интерпретатора, когда вы хотите выполнить скрипт из оболочки. В основном, и не всегда, вы выполняете сценарии, предоставляя интерпретатор извне. Пример использования:
python-x.x script.pyЭто будет работать даже если у вас нет Декларатор притон.
почему первый более "портативный", потому что,
/usr/bin/envсодержитPATHдекларация, которая учитывает все пункты назначения, где ваша система исполняемые файлы находятся.Примечание: Tornado строго не использует shebangs, а Django строго Нет. это зависит от того, как вы выполняете основную функцию вашего приложения.
также: это не зависит от Python.
иногда, если ответ не очень ясен (я имею в виду, что вы не можете решить, да или нет), то это не имеет большого значения, и вы можете игнорировать проблему до тех пор, пока ответ и очистить.
The
#!только цель для запуска скрипта. Django загружает источники самостоятельно и использует их. Ему никогда не нужно решать, какой интерпретатор следует использовать. Сюда, в#!на самом деле не имеет смысла здесь.вообще, если это модуль и не может использоваться в качестве скрипта, нет необходимости использовать
#!. С другой стороны, источник модуля часто содержитif __name__ == '__main__': ...по крайней мере, с некоторым тривиальным тестированием функциональности. Тогда#!снова имеет смысл.одна веская причина для использования
#!Это когда вы используете оба скрипта Python 2 и Python 3 - они должны интерпретироваться разными версиями Python. Таким образом, вы должны помнить, чтоpythonнеобходимо использовать при запуске скрипта вручную (без#!внутри). Если у вас есть смесь таких скриптов, это хорошая идея, чтобы использовать#!внутри, сделайте их исполняемыми и запустите их как исполняемые файлы (chmod ...).при использовании MS-Windows,
#!не было смысла -- до недавнего времени. Python 3.3 представляет средство запуска Windows Python (py.exe и pyw.exe), который считывает#!строка, обнаруживает установленные версии Python и использует правильную или явно нужную версию Python. Как расширение может быть связано с программа, вы можете получить подобное поведение в Windows, как с execute flag в системах на базе 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. Это все еще имело значение"C:\Python27\python.exe" "%1" %*из моего предыдущего Python 2.7 установка. Я изменил значение этого раздела реестра на
"C:\Windows\py.exe" "%1" %*и обработка линии Shebang запуска Python работала, как описано выше.
ответ: только если вы планируете сделать его исполняемым скриптом командной строки.
вот:
начните с проверки правильной строки shebang для использования:
which pythonвозьмите выход из этого и добавьте его (с shebang #!) в первой строке.
в моей системе он отвечает так:
$which python /usr/bin/pythonтак что ваш shebang будет выглядеть так:
#!/usr/bin/pythonпосле сохранения, он все равно будет работать, как до того, как python увидит эту первую строку в качестве комментария.
python filename.pyчтобы сделать его командой, скопируйте его, чтобы удалить расширение .py.
cp filename.py filenameскажите файловой системе, что это будет исполняемый файл:
chmod +x filenameчтобы проверить это, используйте:
./filenameлучше всего переместить его где-то в вашем $PATH, поэтому все, что вам нужно ввести, это само имя файла.
sudo cp filename /usr/sbinтаким образом, он будет работать везде (без ./ перед началом filename)
использовать первый
which pythonэто даст выход в качестве места, где мой интерпретатор python (двоичный) присутствует.
этот вывод может быть любым, например
/usr/bin/pythonили
/bin/pythonтеперь соответствующим образом выберите линию shebang и используйте ее.
для обобщения мы можем использовать:
#!/usr/bin/envили
#!/bin/env
Comments