9

出于某种原因,-O我访问的 Red Hat Enterprise Server(版本 5.3)上的 shebang 行中无法识别(优化的)标志。在其他系统上,可以毫无问题地识别标志。

在 OS X 上执行下面的脚本可以正常工作。-O可以验证标志的识别,因为它在if __debug__条件下启用(当不存在时)或禁用(当给定时)任何东西:

#!/usr/bin/env python -O                                                                                                                                                                       

if __name__ == '__main__':

    if __debug__:
        print 'lots of debugging output on'

    print 'Fin'

在 RHE 系统上执行相同的脚本会导致:

/usr/bin/env: python -O: 没有这样的文件或目录

没有该-O标志,脚本将在 RHE 系统上正常执行(即,__debug__内置变量将设置为True)。

有没有跨平台的方法来解决这个问题?是否有一种特定于平台的方法可以将 shebang 行上的标志问题修复到 python 解释器?

编辑:在解释器范围 内设置变量(不使用 shebang 标志)的任何其他解决方法__debug__也会很有趣。

4

8 回答 8

4

如何制作一个小的 shell 脚本:

蟒蛇

#!/bin/sh    
/usr/bin/env python -O "$@"

然后更改您的脚本以使用:

#!pythono       

另请注意,将环境变量设置PYTHONOPTIMIZE为非空字符串与使用-O标志相同。从man python手册页:

   PYTHONOPTIMIZE
          If this is set to a non-empty string it is equivalent to  specifying  the
          -O option. If set to an integer, it is equivalent to specifying -O multi‐
          ple times.
于 2011-04-20T19:38:05.567 回答
4

一些系统不允许在一个#!-style 行上有多个参数。在任何情况下,“env hack”都不是官方推荐的解决路径问题的方法 - 解决此问题的首选方法是让安装程序根据系统的需要重写#!引用/bin/python,的行/usr/bin/python

http://pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html

于 2011-04-20T19:38:22.793 回答
4

为了稍微扩展unutbuPYTHONOPTIMIZE所说的内容,您可以选择在运行时进行初始化。这适用于所有现代 shell:

% PYTHONOPTIMIZE=1 foo.py
Fin

为了完整性:

% foo.py
lots of debugging output on
Fin
于 2011-04-20T19:53:05.773 回答
1

请试试这个:

#!/bin/sh
''''exec python -O -- "$0" ${1+"$@"} # '''
if __name__ == '__main__':

    if __debug__:
        print 'lots of debugging output on'

    print 'Fin'
# vi: syntax=python
于 2012-01-29T07:13:04.833 回答
0

将shebang更改为:

#!/usr/bin/python -O

当然,这假设 Python 解释器安装为/usr/bin/python; 否则,根据需要进行调整。

另请参阅这个问题我的回答

于 2012-01-29T07:22:13.470 回答
0

我相信您使用的原因#!/usr/bin/env python是您可以利用PATH找到您最喜欢的python.

如果不是这种情况并且您可以很好地使用/usr/bin/python(或解释器的其他硬编码路径),那么最直接的解决方案应该是#!/usr/bin/python -O按照@keith-thompson 的建议使用

但是,假设您想继续依赖于PATHfind python,您将需要调用 shell 才能控制命令行:

#!/bin/sh
exec python -O - "$@" <<EOF

# ... your python code starts here ...
if __name__ == '__main__':

    if __debug__:
        print 'lots of debugging output on'

    print 'Fin'
# ... your python code ends here ...

EOF

这类似于pythono@unutbu 建议的解决方案,只是它不依赖于PATH找到中间脚本,这意味着它的性能稍好一些,并且更安全一些。

此解决方案具有混合两种语言的缺点,这意味着您不能简单地说使用set topython myscript.py执行代码。如果您打算有时通过打开脚本(例如)直接执行代码,但有时在关闭的调试环境(例如)中手动运行脚本,那么我相信您最好的选择是使用@ade-yu 提出的专家技巧或使用@unutbu 建议的简单选项。__debug__True~/bin/myscript.py-Opython ~/bin/myscript.py-Opythono

希望这可以帮助!

于 2018-04-26T16:13:52.140 回答
-1

只需制作没有旗帜的shebang即可;然后,再次执行环境,并将标志传递给heredoc。

#!/usr/bin/env python

/usr/bin/env python -O <<EOF
code goes here...
...
EOF

基本上在文件末尾有你的终止 EOF。

于 2016-05-11T23:38:29.393 回答
-2

假设您想继续使用#!/usr/bin/env,您可以利用以下事实:

  1. python其命令行开关具有等效的环境变量
  2. env可用于在运行命令之前设置环境变量

将这些放在一起,您将获得以下解决方案:

#!/usr/bin/env PYTHONOPTIMIZE=1 python

您要求“跨平台”。这仅适用于 Unix(例如 Linux、OS X 等)。我不能为 Windows 说话。我希望这也能在cygwinYMMV 下工作。

于 2014-07-22T16:32:03.710 回答