python cod中的4个撇号

2024-06-16 09:25:46 发布

您现在位置:Python中文网/ 问答频道 /正文

参考https://github.com/noxrepo/pox/blob/carp/pox.py

我想知道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()

Tags: 代码pydevdebugifbinexportpypy
2条回答

这个文件可以作为shell脚本Python脚本执行。注意shebang是#!/bin/sh,因此脚本首先要作为shell脚本运行。(我忽略了-参数,它表示sh应该从标准输入而不是文件中读取。我不太清楚它在这里有什么意义,因为我从来没有见过一个舍邦是这样写的。)

预期的调用类似于./pox.py ...或{}

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

  1. exec pypy/bin/pypy $OPT "$0" $FLG "$@"
  2. exec python2.7 $OPT "$0" $FLG "$@"
  3. exec python $OPT "$0" $FLG "$@"

然后将执行与Python脚本相同的文件,因此shell永远看不到以第二个'''开头的行(这很好,因为第一个'开头的单词既没有以最后一个结束符'终止,如果字符串的终止,则它也不是有效的命令)。"$0"是当前文件的名称,"$@"表示脚本的参数(除了传递给Python脚本之外,shell脚本将忽略这些参数,如下所示)。在

一旦脚本作为Python脚本运行,以''''true开头的行将被简单地视为将被忽略的doc字符串的开头。Python脚本本身就是

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

为什么这一切都要从''''true开始?作为shell脚本,需要有偶数个引号来平衡彼此。但是,''''本身就是一个空字符串,shell会尝试将其视为命令,并且没有任何命令的名称是空字符串。''''true但是,确实会产生一个有效的命令。在

总体答案

前三个撇号开始一个多行字符串。下一个撇号只是字符串内容的一部分。在

检查结果

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

>>> 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的一部分保留的。在

细节

根据tokenize模块,下面是Python如何查看上述代码:

^{pr2}$

标记化脚本

下面是一个python2.7脚本,它标记痘.py脚本:

from __future__ import print_function
import tokenize
import token

with open('pox.py') as f:
    for tok in tokenize.generate_tokens(f.readline):
        tok_type, tok_str, (srow, scol), (erow, ecol), logical_lineno = tok
        print('%-10s: %r' % (token.tok_name[tok_type], tok_str))

相关问题 更多 >