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

У меня есть канонический Шебанг в верхней части моих сценариев Python.

#!/usr/bin/env python

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

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

Могу ли я вставить опцию -u в шебанг, как это...

#!/usr/bin/env python -u

и только звонок:

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

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

3 ответа

Решение

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

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

#!/usr/bin/python -u

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

В новых версиях env с coreutils 8.30 есть опция -Sза это. Цитата из man env:

          The -S option allows specifing multiple parameters in a script.  Running a script named 1.pl containing the follow‐
  ing first line:

         #!/usr/bin/env -S perl -w -T

  Will execute perl -w -T 1.pl .

  Without the '-S' parameter the script will likely fail with:

         /usr/bin/env: 'perl -w -T': No such file or directory

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

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

#!/usr/bin/env bash
python -u -and -other -options "$@"

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

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

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

Другие вопросы по тегам