如何修复在某些系统上不被识别的shebang标志
不知道为什么,在我使用的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 个回答
为了稍微扩展一下unutbu所说的内容,你可以选择在运行时初始化PYTHONOPTIMIZE
。这个方法适用于所有现代的命令行工具:
% PYTHONOPTIMIZE=1 foo.py
Fin
另外,为了完整性:
% foo.py
lots of debugging output on
Fin
有些系统不允许在 #!
开头的行中使用多个参数。所谓的“env hack”其实并不是解决路径问题的官方推荐方法。更好的做法是让安装程序把 #!
行改写成指向 /bin/python
或 /usr/bin/python
,具体取决于系统的情况。
http://pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
可以试着写一个简单的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.