Типичный заголовок должен быть
#!/usr/bin/env python
Но я нашел ниже также работы при выполнении сценария как $python ./my_script.py
#!/usr/bin/python
#!python
Что такое различие между этими 2 заголовками? Какова могла быть проблема для 2-й? Также обсуждение случая для интерпретатора Python находится в ПУТИ или нет.Спасибо.
Во-первых, каждый раз, когда вы запускаете скрипт с явным использованием интерпретатора, как в
$ 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
исполняемый файл в текущем каталоге при запуске сценария. Не рекомендуется.
Исполняемый файл Python может быть установлен не в /usr/bin, но env
почти всегда присутствует в этом месте, поэтому использование /usr/bin/env
является более переносимым.
Да, есть - python может находиться не в /usr/bin
, а, например, в /usr/local/bin
(BSD).
При использовании virtualenv это может быть даже что-то вроде ~/projects/env/bin/python
Из справочной страницы для env
(GNU coreutils 6.10):
env - run a program in a modified environment
Теоретически вы можете использовать env
для сброса среды (удаление многих из существующие переменные среды) или добавьте дополнительные переменные среды в заголовок скрипта. Фактически, две упомянутые вами версии идентичны. (Хотя другие отметили хороший момент: указание python
через env
позволяет абстрактно указать python
, не зная его путь.)