是否有可能在python shebang中包含命令行选项?

时间:2013-05-14 17:32:17

标签: python linux command-line

我的python脚本顶部有规范的shebang。

#!/usr/bin/env python

但是,我仍然经常想在运行脚本时将无缓冲的输出导出到日志文件中,所以我最终调用:

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

我可以像这样在shebang中嵌入-u选项......

#!/usr/bin/env python -u

并且只打电话:

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

......仍然没有缓解?我怀疑这不起作用,并希望在尝试之前检查。有什么能够实现这个目标吗?

3 个答案:

答案 0 :(得分:11)

你可以在shebang行上有参数,但大多数操作系统对参数的数量有一个非常小的限制。 POSIX只要求支持一个参数,这很常见,包括Linux。

由于您正在使用/usr/bin/env命令,因此您已经在使用python的那个参数,因此您无法添加另一个参数-u。如果您想使用python -u,则需要将绝对路径硬编码为python,而不是使用/usr/bin/env,例如。

#!/usr/bin/python -u

请参阅此相关问题:How to use multiple arguments with a shebang (i.e. #!)?

答案 1 :(得分:3)

执行此操作的便携方法是创建另一个体现您选项的可执行文件。

例如,将此文件放在路径上并将其命名为upython,并使其可执行:

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

...使用您需要的任何选项。然后你的myscript.py脚本就像这样:

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

Torxed建议通过shell别名来做这件事。如果在任何版本的unix中都有效,我会感到非常惊讶。它在我刚测试的少数发行版中不起作用。我的方法适用于任何unix。

答案 2 :(得分:2)

在从 coreutils 8.30 开始的新版 [Unit] Description=discord bots After=multi-user.target Conflicts=getty@tty1.service [Service] Type=simple ExecStart=/usr/bin/python3.8 /home/myusername/bot/%i/%i.py StandardInput=tty-force [Install] WantedBy=multi-user.target`enter code here` 中,有用于此的选项 env。来自 -S 的引用:

<块引用>
man env