Или почему это не работает, если вы правильно установили файл как исполняемый? (В моей системе он просто зависает, но его можно убить с помощью ^C.)
#!/usr/bin/env TEST=TEST python
print('hello')
Пока это делает:
#!/usr/bin/env python
print('hello')
Как и это:
[fred@pc build]$ /usr/bin/env TEST=TEST python hello.py
hello
Если в вашей системе есть strace
, запустите скрипт, используя что-то вроде strace -f script-name
(-f
означает «следить за дочерними процессами»). Я предполагаю, что это python
ждет stdin
, то есть клавиатуры, когда она кажется «зависшей», поэтому вы должны увидеть строку, начинающуюся read(0,...
с вывода strace
. В противном случае нажмите <CTRL>+D для EOF.
В некоторых системах, включая Linux, эффект
#!/usr/bin/env TEST=TEST python
строка в 'hello.py', если вы запускаете ее с './hello.py', аналогична запуску
/usr/bin/env 'TEST=TEST python' ./hello.py
Обратите внимание, что «TEST=TEST python» — это один аргумент. Это приводит к тому, что env устанавливает переменную среды TEST
в 'TEST python'
, а затем запускает ./hello.py
с исполнитель. Затем снова обрабатывается строка shebang, и процесс рекурсивно повторяется. Общий эффект заключается в том, что env
выполняется снова и снова, пока процесс не будет прерван. Если вы запустите top
в системе во время выполнения, вы увидите очень загруженный процесс.
См. Статью Википедии Шебанг (Unix) для получения информации о том, как работает механизм #!
. Он включает некоторые детали различий между тем, как он обрабатывается в разных системах.
Невозможно установить переменные среды в строке shebang в Linux и многих других системах. Вам нужно будет либо установить их в самой программе, либо, если это не подходит, использовать программу-оболочку (например, тривиальную программу оболочки) для запуска программы Python.
Начиная с версии 8.30 env имеет опцию -S, которая делает вещи работать также в Linux:
Использовать
#!/usr/bin/env -S TEST=TEST python
У меня (Mac) работает, даже используя
print(os.environ['TEST'])
для проверки.