出于某种原因,我访问的Red Hat Enterprise Server(版本5.3)上的shebang行中无法识别-O
(已优化)标志。在其他系统上,可以毫无问题地识别该标志。
在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解释器?
编辑:设置__debug__
变量(不使用shebang标志)解释器范围的任何其他变通方法也很有趣。
答案 0 :(得分:4)
某些系统不允许在#!
样式行上使用多个参数。在任何情况下,“env hack”都不是官方推荐的解决路径问题的方法 - 处理此问题的首选方法是让安装重写#!
行以引用/bin/python
,{ {1}},适用于系统。
http://pubs.opengroup.org/onlinepubs/009695399/utilities/sh.html
答案 1 :(得分:4)
要稍微扩展unutbu所说的内容,您可以选择在运行时初始化PYTHONOPTIMIZE
。这适用于所有现代贝壳:
% PYTHONOPTIMIZE=1 foo.py
Fin
为了完整性:
% foo.py
lots of debugging output on
Fin
答案 2 :(得分:3)
制作小型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.
答案 3 :(得分:1)
请试试这个:
#!/bin/sh
''''exec python -O -- "$0" ${1+"$@"} # '''
if __name__ == '__main__':
if __debug__:
print 'lots of debugging output on'
print 'Fin'
# vi: syntax=python
答案 4 :(得分:0)
将shebang更改为:
#!/usr/bin/python -O
当然,这假设Python解释器安装为/usr/bin/python
;否则,根据需要进行调整。
答案 5 :(得分:0)
我相信您使用#!/usr/bin/env python
的原因是为了让您可以利用PATH
找到您最喜欢的python
版本。
如果情况并非如此,您可以使用/usr/bin/python
(或解释器的其他硬编码路径),那么最直接的解决方案应该是使用@keith建议的#!/usr/bin/python -O
-thompson
但是,假设您希望继续依赖PATH
查找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
这与@unutbu建议的pythono
解决方案类似,不同之处在于它不依赖于PATH
来查找中间脚本,这意味着它的性能稍好一些,而且更安全一些
此解决方案具有混合两种语言的缺点,这意味着您不能简单地说python myscript.py
来执行代码,__debug__
设置为True
。如果您打算能够直接通过脚本(例如~/bin/myscript.py
)启用-O
来执行代码,但有时可以在调试环境中手动运行脚本(例如{{ 1}})关闭python ~/bin/myscript.py
,然后我相信您最好的选择是使用@ ade-yu提出的专家技巧或使用@unutbu建议的简单-O
选项。
希望这有帮助!
答案 6 :(得分:-1)
只是让你的shebang没有旗帜;然后,再次执行环境,并将标志传递给heredoc。
#!/usr/bin/env python
/usr/bin/env python -O <<EOF
code goes here...
...
EOF
基本上在文件末尾有终止EOF。
答案 7 :(得分:-2)
假设您想继续使用#!/usr/bin/env
,您可以利用
python
具有与其命令行开关相同的环境变量env
可用于设置环境变量
醇>
将这些放在一起,您将获得以下解决方案:
#!/usr/bin/env PYTHONOPTIMIZE=1 python
你问过“跨平台”。这仅适用于Unix(例如Linux,OS X等)。我不能代表Windows。我希望这也可以在cygwin
下工作,但YMMV。