【问题标题】:Is it possible to include command line options in the python shebang?是否可以在 python shebang 中包含命令行选项?
【发布时间】:2013-05-09 02:22:09
【问题描述】:

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

#!/usr/bin/env python

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

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

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

#!/usr/bin/env python -u

并且只调用:

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

...仍然获得非缓冲?我怀疑这行不通,并想在尝试之前检查一下。有什么东西可以做到这一点吗?

【问题讨论】:

  • 是的,你应该这样做。 “shebang”只是一个指向负责脚本的二进制应用程序的指针。如果没有,您可以创建一个别名 alias ppython="python -u" 并使用 #!/usr/bin/env ppython
  • Torxed,你试过你的答案了吗?这种方法在 OSX 或 Linux 中不起作用。如果它适用于您的操作系统,请分享详细信息,因为这会很有趣。它在 OSX 或 Linux(或者我相信任何类型的 unix)中不起作用的原因是 env 在路径上搜索可执行文件,而别名不在路径上。别名不能以同样的方式在 shebang 线上工作,原因与内置插件不能在 shebang 线上工作的原因相同。如果您的操作系统允许,请分享!

标签: python linux command-line


【解决方案1】:

在自 coreutils 8.30 以来的 env 的新版本中,为此提供了选项 -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

【讨论】:

  • 整洁! 8年后我的祈祷得到了回应!
【解决方案2】:

执行此操作的一种可移植方式是创建另一个包含您的选项的可执行文件。

例如,把这个文件放在你的路径上,命名为upython,并使其可执行:

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

... 使用您需要的任何选项。那么你的myscript.py 脚本可以是这样的:

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

Torxed 建议通过 shell 别名来执行此操作。如果这适用于任何版本的unix,我会感到非常惊讶。它在我刚刚测试的几个发行版中不起作用。我的方法适用于任何 unix。

【讨论】:

  • ps: 将 cmdline args 传递给另一个脚本或函数的正确方法是使用带引号的 "$@"(而不是 $@),因为没有引号,带有空格的 args 会被分解. (这里关于别名的部分是绝对正确的。它不会起作用。)最后,我建议不要使用env bash,而是直接使用bash 的路径(例如#!/bin/bash)。可以肯定的是,Python 是有问题的。巴什,没那么多。在调整 PATH 以使用不同的其他工具(python、make 等)之后,使用 bash 的更大问题实际上是意外使用了错误的。
  • 对于像这样的包装脚本,我喜欢放入“exec”,这样包装就不再出现在进程列表中。即“exec python -u -and -other ....”
【解决方案3】:

您可以在 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. #!)?

【讨论】:

  • 谢谢。它看起来很容易,但我知道会有一个问题。 =) 是否有深入了解 POSIX 要求的人,我可以发送电子邮件讨论如果可以支持多个论点,这个功能会有多棒?
  • 可能不会。这就是它一直以来的工作方式,POSIX 只是对现有行为进行了标准化。即使他们更改了 POSIX,您也必须等待数年才能重新设计足够的实现,以便您可以便携地使用它。
猜你喜欢
  • 2021-02-24
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-28
  • 1970-01-01
  • 2011-12-11
  • 2015-05-28
  • 2011-03-24
相关资源
最近更新 更多