python代码中的4个撇号
参考文献 我想知道这4个撇号是什么意思?它看起来不像是注释,在代码末尾还有另外3个撇号。有人能解释一下下面的代码吗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
#!/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“$@”
'
开头的行(这很好,因为由第一个'
开头的单词既不会以最后一个结束符'
结尾,如果它被终止,字符串也不会是有效的命令)“$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()