Заголовок скрипта Python - PullRequest
       12

Заголовок скрипта Python

70 голосов
/ 27 июня 2010

Типичный заголовок должен быть

#!/usr/bin/env python

Но я обнаружил, что ниже также работает при выполнении сценария, как $python ./my_script.py

#!/usr/bin/python
#!python

Какая разница между этими 2 заголовками? В чем может быть проблема для 2-го? Пожалуйста, также обсуждаем, что дело с интерпретатором Python в PATH или нет. Спасибо.

Ответы [ 6 ]

88 голосов
/ 28 июня 2010

Во-первых, каждый раз, когда вы запускаете скрипт, используя интерпретатор явно, как в

$ python ./my_script.py
$ ksh ~/bin/redouble.sh
$ lua5.1 /usr/local/bin/osbf3

строка #! всегда игнорируется. Строка #! является функцией Unix только для исполняемых сценариев , и вы можете увидеть ее полностью документированную на странице руководства для execve(2). Там вы найдете, что слово, следующее за #!, должно быть путем к действительному исполняемому файлу. Так

#!/usr/bin/env python

выполняет все, что python для пользователей $PATH. Эта форма устойчива к перемещению интерпретатора Python, что делает ее несколько более переносимой, но это также означает, что пользователь может переопределить стандартный интерпретатор Python, поставив перед ним что-то в $PATH. В зависимости от ваших целей, это поведение может быть или не быть в порядке.

Далее

#!/usr/bin/python

относится к общему случаю, когда в /usr/bin установлен интерпретатор Python. Если он установлен где-то еще, вы проигрываете. Но это хороший способ убедиться, что вы получаете именно ту версию, которую хотите, или вообще ничего (поведение при сбое), как в

#!/usr/bin/python2.5

Наконец,

#!python

работает только при наличии исполняемого файла python в текущем каталоге при запуске скрипта. Не рекомендуется.

23 голосов
/ 10 апреля 2015


Я бы предложил 3 вещи в начале вашего скрипта:

Во-первых, как уже говорилось, используйте среду:

#!/usr/bin/env python

Во-вторых, установите кодировку:

# -*- coding: utf-8 -*-

В-третьих, установите некоторую строку документа:

"""This is a awesome
    python script!"""

И точно я бы использовал " " (4 пробела) для идентификатора.
Окончательный заголовок будет выглядеть так:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""This is a awesome
        python script!"""


С наилучшими пожеланиями и счастливого кодирования.

5 голосов
/ 27 июня 2010

Исполняемый файл Python может быть установлен в месте, отличном от / usr / bin, но env почти всегда присутствует в этом месте, поэтому использование /usr/bin/env более переносимо.

2 голосов
/ 27 июня 2010

Из справочной страницы для env (GNU coreutils 6.10):

env - run a program in a modified environment

Теоретически вы можете использовать env для сброса окружения (удаления многих существующих переменных окружения) или добавления дополнительных переменных окружения в заголовок скрипта. На практике две упомянутые вами версии идентичны. (Хотя другие отметили хороший момент: указание от python до env позволяет абстрактно указывать python, не зная его пути.)

1 голос
/ 27 июня 2010

Да, есть - python может быть не в /usr/bin, но, например, в /usr/local/bin (BSD).

При использовании virtualenv это может быть даже что-то вроде ~/projects/env/bin/python

0 голосов
/ 11 декабря 2014

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

Поскольку все больше и больше людей начинают использовать virtualenv для разработки на python предпочитайте использовать /usr/bin/env python, если вы не хотите, чтобы люди использовали их пользовательские двоичные файлы Python.

Примечание: вы также должны понимать, что существуют потенциальные проблемы безопасности (в многопользовательской среде), когда вы позволяете людямЗапустите ваши скрипты в их пользовательских средах.Вы можете получить некоторые идеи от здесь .

...