这个for循环的目的是什么?

时间:2019-03-20 22:40:37

标签: python

我正在跟着《 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"

2 个答案:

答案 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循环一次处理每个命令行参数(即选项)值对。参数的数量可以不同。

您对更具体的内容感兴趣吗?