Python 如何修复某些系统上无法识别的shebang标志
由于某些原因,Python 如何修复某些系统上无法识别的shebang标志,python,shell,shebang,Python,Shell,Shebang,由于某些原因,-O(优化)标志在我访问的Red Hat Enterprise Server(5.3版)的shebang行中无法识别。在其他系统上,识别标志时不会出现任何问题 在OSX上执行下面的脚本可以正常工作。可以验证-O标志的识别,因为它在条件下启用(不存在时)或禁用(给定时): #!/usr/bin/env python -O
-O
(优化)标志在我访问的Red Hat Enterprise Server(5.3版)的shebang行中无法识别。在其他系统上,识别标志时不会出现任何问题
在OSX上执行下面的脚本可以正常工作。可以验证-O
标志的识别,因为它在条件下启用(不存在时)或禁用(给定时):
#!/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系统上正常执行(即\uuuuu debug\uuuu
内置变量将设置为True
)
是否有跨平台的方法来解决此问题?是否有特定于平台的方法来解决python解释器shebang行上的标志问题
编辑:在解释器范围内设置\uuuu调试\uuuu
变量(不使用shebang标志)的任何其他解决方法也会很有趣。制作一个小型shell脚本怎么样:
蟒蛇:
#!/bin/sh
/usr/bin/env python -O "$@"
然后将脚本更改为使用:
#!pythono
还要注意,将环境变量PYTHONOPTIMIZE
设置为非空字符串与使用-O
标志相同。从manpython
手册页:
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.
有些系统不允许在#上使用多个参数代码>-样式行。在任何情况下,“env hack”都不是官方推荐的解决路径问题的方法-处理此问题的首选方法是让安装程序重写#代码>行,参考系统所需的/bin/python
,/usr/bin/python
要稍微扩展前面所说的内容,您可以选择在运行时初始化PYTHONOPTIMIZE
。这适用于所有现代壳:
% PYTHONOPTIMIZE=1 foo.py
Fin
为了完整性:
% foo.py
lots of debugging output on
Fin
请试试这个:
#!/bin/sh
''''exec python -O -- "$0" ${1+"$@"} # '''
if __name__ == '__main__':
if __debug__:
print 'lots of debugging output on'
print 'Fin'
# vi: syntax=python
将shebang更改为:
#!/usr/bin/python -O
当然,这假设Python解释器安装为/usr/bin/Python
;否则,根据需要进行调整
另请参见和。假设您想继续使用#/usr/bin/env
,您可以利用
python
的命令行开关具有等效的环境变量
env
可用于在运行命令之前设置环境变量
综合这些因素,您可以得到以下解决方案:
#/usr/bin/env PYTHONOPTIMIZE=1 python
你要的是“跨平台”。这仅适用于Unix(例如Linux、OS X等)。我不能为Windows说话。我希望这在cygwin下也能起作用,但是YMMV。只需要让你的shebang没有旗帜;然后,再次执行该环境,并将其标志传递给heredoc
#!/usr/bin/env python
/usr/bin/env python -O <<EOF
code goes here...
...
EOF
#/usr/bin/env python
/usr/bin/env python-O我相信您使用#的原因/usr/bin/env-python
就是这样,您可以利用路径
查找您最喜欢的python版本
如果情况并非如此,并且您可以使用/usr/bin/python
(或解释器的其他硬编码路径),那么最直接的解决方案应该是使用#/usr/bin/python-O
,由@keith 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
#/垃圾箱/垃圾箱
exec python-O-“$@”我模糊地记得一句话,你不能指望在shebang中传递多个参数,而python
就是/usr/bin/env python
中的那个参数,这也是我担心的。我希望能有一些聪明的方法引用python
以及可以使用的标志,但我没有找到任何东西。@uku因为在某些系统上,我不希望默认使用系统版本的python(通常是版本<2.4),我希望允许用户的$PATH
设置选择默认的python解释器(例如,可能在其主目录中的解释器)。@Uku Loskit:Using/usr/bin/env python
允许您的脚本在不同位置安装了python的不同计算机上运行。@Uku:因此,您不必在python解释器的位置发生变化时调整每个脚本(或者-对于广泛分布的东西来说非常重要-当你将它安装在一台将解释器放在其他地方的机器上时)或者你将另一个解释器升级到默认版本(当你使用python3
时,这是一种更为普遍的情况)。呃,如果你能做到这一点,你不需要env
,你只需要python-O"$@"
。我喜欢这样。我认为这是解决我的特定问题的最简单的方法。@unutbu我将/usr/bin/env
调用移到了pythono
内部,因为这大概就是你的意思。应该不需要调用/usr/bin/env pythono
,而脚本可能会执行错误的python
如果你不调用env
。注意pythono
也必须在你的路径上。也很高兴知道。谢谢Random。谢谢。能够在每个脚本的基础上启用/禁用更好。你知道的!这是一个*nix范围的事情,并不特定于Python。这遇到了相同的问题,其中只有she中的第一个参数-bang行保证传递给解释器,例如在Linux上,这会导致/usr/bin/env
调用的无限递归,因为PYTHONOPTIMIZE=1 python
被解释为单个参数-1@DavidFoerster的评论似乎是正确的——至少我可以在freebsd上重现这个问题n在这个答案中会很有用。谢谢你的猫