python代码中的4个撇号

python代码中的4个撇号,python,sh,pox,Python,Sh,Pox,参考文献 我想知道这4个撇号是什么意思?它看起来不像是注释,在代码末尾还有另外3个撇号。有人能解释一下下面的代码吗 #!/bin/sh - ''''true #export OPT="-u -O" export OPT="-u" export FLG="" if [ "$(basename $0)" = "debug-pox.py" ]; then export OPT="" export FLG="--debug" fi if [ -x pypy/bin/pypy ]; then

参考文献

我想知道这4个撇号是什么意思?它看起来不像是注释,在代码末尾还有另外3个撇号。有人能解释一下下面的代码吗

#!/bin/sh -

''''true
#export OPT="-u -O"
export OPT="-u"
export FLG=""
if [ "$(basename $0)" = "debug-pox.py" ]; then
  export OPT=""
  export FLG="--debug"
fi

if [ -x pypy/bin/pypy ]; then
  exec pypy/bin/pypy $OPT "$0" $FLG "$@"
fi

if type python2.7 > /dev/null 2> /dev/null; then
  exec python2.7 $OPT "$0" $FLG "$@"
fi
exec python $OPT "$0" $FLG "$@"
'''
from pox.boot import boot
if __name__ == '__main__':
  boot()
总体答案 前三个撇号开始一个多行字符串。下一个撇号只是字符串内容的一部分

检查结果 脚本将字符串存储在变量中。使用
python-i pox.py
交互运行代码后,很容易直接看到解析的代码:

>>> print __doc__
'true
#export OPT="-u -O"
export OPT="-u"
export FLG=""
if [ "$(basename $0)" = "debug-pox.py" ]; then
  export OPT=""
  export FLG="--debug"
fi

if [ -x pypy/bin/pypy ]; then
  exec pypy/bin/pypy $OPT "$0" $FLG "$@"
fi

if type python2.7 > /dev/null 2> /dev/null; then
  exec python2.7 $OPT "$0" $FLG "$@"
fi
exec python $OPT "$0" $FLG "$@"
注意第四个撇号是如何作为docstring的一部分保留的

细节 根据模块,以下是Python如何查看上述代码:

NL        : '\n'
COMMENT   : '#!/bin/sh -'
NL        : '\n'
NL        : '\n'
STRING    : '\'\'\'\'true\n#export OPT="-u -O"\nexport OPT="-u"\nexport FLG=""\nif [ "$(basename $0)" = "debug-pox.py" ]; then\n  export OPT=""\n  export FLG="--debug"\nfi\n\nif [ -x pypy/bin/pypy ]; then\n  exec pypy/bin/pypy $OPT "$0" $FLG "$@"\nfi\n\nif type python2.7 > /dev/null 2> /dev/null; then\n  exec python2.7 $OPT "$0" $FLG "$@"\nfi\nexec python $OPT "$0" $FLG "$@"\n\'\'\''
NEWLINE   : '\n'
NAME      : 'from'
NAME      : 'pox'
OP        : '.'
NAME      : 'boot'
NAME      : 'import'
NAME      : 'boot'
NEWLINE   : '\n'
NAME      : 'if'
NAME      : '__name__'
OP        : '=='
STRING    : "'__main__'"
OP        : ':'
NEWLINE   : '\n'
INDENT    : '  '
NAME      : 'boot'
OP        : '('
OP        : ')'
NEWLINE   : '\n'
DEDENT    : ''
ENDMARKER : ''
标记化脚本 下面是一个Python 2.7脚本,用于标记pox.py脚本:


这是一个可以作为shell脚本和Python脚本执行的文件。注意,shebang是
#/bin/sh
,因此该脚本将首先作为shell脚本运行。(我忽略了
-
参数,这表明
sh
应该从标准输入而不是文件中读取。我不太确定它的意义是什么,因为我从未见过这样编写的shebang。)

预期的调用类似于
/pox.py…
sh./pox.py…

脚本的第一行是
'''true
,删除引号后,它与
true
相同,因此命令运行,除了成功退出外,什么也不做。以下几行是确定要使用哪个Python解释器以及要传递给调用的选项的有效命令。三个
exec
命令之一

  • exec pypypy/bin/pypy$OPT“$0”$FLG“$@”
  • exec python2.7$OPT“$0”$FLG“$@”
  • exec python$OPT“$0”$FLG“$@”
  • 然后将执行与Python脚本相同的文件,因此shell永远看不到以第二个
    '
    开头的行(这很好,因为由第一个
    '
    开头的单词既不会以最后一个结束符
    '
    结尾,如果它被终止,字符串也不会是有效的命令)
    “$0”
    是当前文件的名称,
    “$@”
    表示脚本的参数(shell脚本会忽略这些参数,除非传递到Python脚本,如下所示)

    一旦脚本作为Python脚本运行,那么以
    ''''true
    开头的行将被视为将被忽略的文档字符串的开头。Python脚本本身非常简单

    from pox.boot import boot
    if __name__ == '__main__':
      boot()
    

    至于为什么这一切都必须从
    “true
    开始?作为一个shell脚本,您需要有偶数个引号来平衡彼此。但是,
    “”
    本身就是一个空字符串,shell将尝试将其视为一个命令,并且不存在名称为空字符串的命令<代码>''''true,但是,确实会生成有效的命令。

    任何附加的撇号都被视为块的一部分,它只是一个输入错误。3个单引号(或3个双引号)将创建一个引号块,直到读取下一组3个单引号。这就是shell代码。。。不Python@cricket_007该脚本是有效的Python和有效的shell。作为Python代码,它是一个包含shell脚本的docstring。作为shell,删除引号后,
    ''true
    的计算结果与
    true
    的计算结果相同。下一个
    '
    在技术上会产生错误,但是前面的
    exec
    会阻止shell看到脚本的其余部分。python和shell脚本可以以这种方式一起工作吗?这合法吗?在python手册中找不到这个项目真是令人沮丧。。。
    from pox.boot import boot
    if __name__ == '__main__':
      boot()