Заголовок сценария Python

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

#!/usr/bin/env python

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

#!/usr/bin/python
#!python

Что такое различие между этими 2 заголовками? Какова могла быть проблема для 2-й? Также обсуждение случая для интерпретатора Python находится в ПУТИ или нет.Спасибо.

73
задан Stan 27 June 2010 в 19:50
поделиться

4 ответа

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

$ 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 исполняемый файл в текущем каталоге при запуске сценария. Не рекомендуется.

92
ответ дан 24 November 2019 в 12:20
поделиться

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

5
ответ дан 24 November 2019 в 12:20
поделиться

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

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

1
ответ дан 24 November 2019 в 12:20
поделиться

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

env - run a program in a modified environment

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

2
ответ дан 24 November 2019 в 12:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: