Подтвердить что ты не робот

Заголовок Python script

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

#!/usr/bin/env python

Но я нашел ниже, также работает при выполнении script как $python ./my_script.py

#!/usr/bin/python
#!python

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

4b9b3361

Ответ 1

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

$ 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

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

#!/usr/bin/python2.5

Наконец,

#!python

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

Ответ 2


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

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

#!/usr/bin/env python

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

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

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

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

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

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

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


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

Ответ 3

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

Ответ 4

Из man-страницы для env (GNU coreutils 6.10):

env - run a program in a modified environment

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

Ответ 5

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

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

Ответ 6

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

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

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