我正在跟着《 Black Hat Python》这本书,目前的活动是建立一个netcat替代品。要设置选项,请使用“ getopt”。我对于为什么在循环中使用o,a
来检查选项感到困惑?
if not len(sys.argv[1:]):
usage()
# read the command line options
try:
opts, args = getopt.getopt(sys.argv[1:],"hle:t:p:cu:", \
["help", "listen", "execute", "target", "port", "command", "upload"])
except getopt.GetoptError as err:
print(str(err))
usage()
for o,a in opts:
if o in ("-h","--help"):
usage()
elif o in ("-l", "--listen"):
listen = True
elif o in ("-e", "--execute"):
execute = a
elif o in ("-c", "--commandshell"):
command = True
elif o in ("-u", "--upload"):
upload_destinaton = a
elif o in ("-t", "--target"):
target = a
elif o in ("-p", "--port"):
port = int(a)
else:
assert False,"Unhandled Option"
答案 0 :(得分:2)
如果您查看documentation page for python getopt,有一个示例演示了这一点:
>>> import getopt
>>> args = '-a -b -cfoo -d bar a1 a2'.split()
>>> args
['-a', '-b', '-cfoo', '-d', 'bar', 'a1', 'a2']
>>> optlist, args = getopt.getopt(args, 'abc:d:')
>>> optlist
[('-a', ''), ('-b', ''), ('-c', 'foo'), ('-d', 'bar')] # <--- HERE
>>> args
['a1', 'a2']
opts
(在您的问题中)对应于上面示例中的optlist
。
getopt
返回一个元组列表作为第一个返回值(第二个列表作为第二个返回值),因此通过使用for o,a in opts
,代码在每次循环迭代期间将这些元组拆分开。
答案 1 :(得分:1)
opts
是一个选项,值对的列表。参见docs:
返回值包含两个元素:第一个是(选项,值)对的列表;第二个是删除选项列表后剩下的程序参数列表(这是尾部的args)。返回的每个选项和值对都将选项作为其第一个元素,对于短选项(例如,'-x')前缀带有连字符,对于长选项(例如'--long-option')带有两个连字符,并且option参数作为其第二个元素;如果option没有参数,则为空字符串。这些选项在列表中的出现顺序与找到它们的顺序相同,因此允许多次出现。多空选项可能混合在一起。
因此for循环一次处理每个命令行参数(即选项)值对。参数的数量可以不同。
您对更具体的内容感兴趣吗?