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



Я должен положить в мой набор скриптов Python? В какой форме?



#!/usr/bin/env python 


или



#!/usr/local/bin/python


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



Примечание: the торнадо проект использует shebang. С другой стороны,Джанго нет.

1592   10  

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 или python3 on различная система. В настоящее время это относится к 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

    Ничего не найдено.