Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何修复某些系统上无法识别的shebang标志_Python_Shell_Shebang - Fatal编程技术网

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在这个答案中会很有用。谢谢你的猫