Можно ли включить параметры командной строки в 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.