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