Заголовок Python script
Типичный заголовок должен быть
#!/usr/bin/env python
Но я нашел ниже, также работает при выполнении script как $python ./my_script.py
#!/usr/bin/python
#!python
Какая разница между этими двумя заголовками? Что может быть проблемой для второго? Пожалуйста, также обсуждать дело для интерпретатора python в PATH или нет. Спасибо.
Ответы
Ответ 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.
Примечание. Вы также должны понимать, что есть потенциальные проблемы с безопасностью (в многопользовательских средах), когда вы позволяете людям запускать ваши скрипты в своих настраиваемых средах. Вы можете получить некоторые идеи от здесь.