Можно ли включить параметры командной строки в python shebang?

У меня есть канонический shebang в верхней части моих сценариев python.

#!/usr/bin/env python

Тем не менее, я все еще часто хочу экспортировать небуферизованный вывод в файл журнала, когда я запускаю свои скрипты, поэтому в итоге я вызываю:

$ python -u myscript.py &> myscript.out &

Можно ли вставить опцию -u в shebang так...

#!/usr/bin/env python -u

и вызывать только:

$ ./myscript.py &> myscript.out &

... чтобы все еще получить небуферирование? Я подозреваю, что это не сработает, и вы хотите проверить, прежде чем пытаться. Есть ли что-то, что могло бы это сделать?

Ответы

Ответ 1

У вас могут быть аргументы по строке shebang, но большинство операционных систем имеют очень малый предел количества аргументов. POSIX требует только поддержки одного аргумента, и это распространено, включая Linux.

Поскольку вы используете команду /usr/bin/env, вы уже используете этот один аргумент с python, поэтому вы не можете добавить еще один аргумент -u. Если вы хотите использовать python -u, вам нужно жестко закодировать абсолютный путь до python вместо /usr/bin/env, например.

#!/usr/bin/python -u

Смотрите этот связанный вопрос: Как использовать несколько аргументов с помощью shebang (т.е. #!)?

Ответ 2

Портативный способ сделать это - создать другой исполняемый файл, который воплотит ваши параметры.

Например, поместите этот файл на свой путь и назовите его upython и сделайте его выполнимым:

#!/usr/bin/env bash
python -u -and -other -options "[email protected]"

... используя любые параметры, которые вам нужны. Тогда ваш myscript.py script может выглядеть следующим образом:

#!/usr/bin/env upython
(... your normal Python code ...)

Torxed предложил сделать это через псевдоним оболочки. Я был бы очень удивлен, если бы это сработало в любой версии unix. Он не работает в нескольких дистрибутивах, которые я только что тестировал. Мой подход будет работать в любом unix.

Ответ 3

Да, это сработает. Строки Shebang могут включать аргументы, переданные программе, используемой для выполнения script.