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

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

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

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

 #!/usr/bin/python -u 

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

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

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

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

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

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

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