如何修复在某些系统上不被识别的shebang标志

11 投票
8 回答
3006 浏览
提问于 2025-04-16 16:07

不知道为什么,在我使用的Red Hat Enterprise Server(版本5.3)上,-O(优化)这个标志在shebang行中无法识别。而在其他系统上,这个标志没有任何问题。

在OS X上运行下面的脚本是没问题的。可以通过这个标志的作用来验证它是否被识别:当没有这个标志时,它会启用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解释器的标志问题?

编辑:如果有其他方法可以设置__debug__变量(不使用shebang标志),那也很有趣。

8 个回答

4

为了稍微扩展一下unutbu所说的内容,你可以选择在运行时初始化PYTHONOPTIMIZE。这个方法适用于所有现代的命令行工具:

% PYTHONOPTIMIZE=1 foo.py
Fin

另外,为了完整性:

% foo.py
lots of debugging output on
Fin
5

有些系统不允许在 #! 开头的行中使用多个参数。所谓的“env hack”其实并不是解决路径问题的官方推荐方法。更好的做法是让安装程序把 #! 行改写成指向 /bin/python/usr/bin/python,具体取决于系统的情况。

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

4

可以试着写一个简单的shell脚本:

pythono

#!/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.

撰写回答