Когда я использую шебанг #!/usr/bin/env python
для запуска скрипта, как система узнает, какой python
использовать? если я ищу python
путь бин в переменных среды, я ничего не нахожу.
env | grep -i python
Когда я использую шебанг #!/usr/bin/env python
для запуска скрипта, как система узнает, какой python
использовать? если я ищу python
путь бин в переменных среды, я ничего не нахожу.
env | grep -i python
Ответы:
Шебанг ожидает, что будет использован полный путь к интерпретатору, поэтому следующий синтаксис будет неправильным:
Установка полного пути, как это может работать:
но было бы не портативная , как питон может быть установлен
/bin
,/opt/python/bin
или где -то другое место.С помощью
env
это метод, позволяющий переносимым способом указать ОС полный путь, эквивалентный тому, где
python
он впервые находится вPATH
.источник
Линия Шебанга (от «резкого взрыва», т.е.
#!
) обрабатывается ядром. Ядро не хочет знать о переменных среды, таких какPATH
. Таким образом, имя в строке shebang должно быть абсолютным путем к исполняемому файлу. Вы также можете указать дополнительный аргумент для передачи в этот исполняемый файл перед именем скрипта (с системно-зависимыми ограничениями я не буду здесь вдаваться). Например, для скрипта Python вы можете указатьв первой строке, и когда вы выполняете скрипт, ядро будет фактически выполнено
/usr/bin/python /path/to/script
. Но это не удобно: вам нужно указать полный путь к команде. Что делать , если у вас естьpython
в/usr/bin
на некоторых машинах и/usr/local/bin
на других? Или вы хотите установитьPATH
для/home/joe/opt/python-2.5/bin
того, чтобы использовать конкретную версию Python? Поскольку ядро не будет выполнятьPATH
поиск за вас, идея состоит в том, чтобы заставить ядро запустить команду, которая, в свою очередь, ищет нужный интерпретатор вPATH
:Это
path-lookup-command
должно взять имя исполняемого файла в качестве аргумента, найти егоPATH
и выполнить: ядро запустится/fixed/path/to/path-lookup-command python /path/to/script
. Как это бывает,env
команда делает именно это. Его основная цель - запустить команду в другой среде, но, поскольку она ищет имя команды$PATH
, она идеально подходит для нашей цели.Хотя это официально не гарантировано, исторические системы Unix при условии ,
env
в/usr/bin
, и современные системы сохранили это место именно из-за широкого использования#!/usr/bin/env
. Таким образом, на практике способ указать, что скрипт должен выполняться любимым интерпретатором Python пользователя,источник
env
иwhich
? поскольку он также получит наиболее подходящий исполняемый файл из моей среды PATH.which
находит исполняемый файл и печатает его путь.env
находит программу, указанную в первом аргументе, и выполняет ее, передавая оставшиеся аргументы.env
это eval версия поwhich
существу.Хорошо, так что беги:
Ваш $ PATH - это список каталогов. Unix будет проходить этот список каталогов по порядку, пока не найдет «python».
Вы можете увидеть, какой каталог он находит с помощью команды which:
источник
sys.path
между активированными env$ env python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/.local/lib/python3.4/site-packages', '/usr/lib/python3.4/site-packages', '/usr/local/lib/python3.4/dist-packages', '/usr/lib/python3/dist-packages']
) и./env/bin/python3
(['', '/home/user/test', '/usr/lib/python3.4', '/usr/lib/python3.4/plat-x86_64-linux-gnu', '/usr/lib/python3.4/lib-dynload', '/home/user/test/env3/lib/python3.4/site-packages']
).