代码之家  ›  专栏  ›  技术社区  ›  stsquad

有没有说服python的getopt处理选项的可选参数?

  •  6
  • stsquad  · 技术社区  · 15 年前

    根据关于python的文档 getopt (我认为)选项字段的行为应 getopt() 功能。但是,我似乎无法为代码启用可选参数:

    #!/usr/bin/python
    import sys,getopt
    
    if __name__ == "__main__":
        try:
            opts, args = getopt.gnu_getopt(sys.argv[1:], "v::", ["verbose="])
        except getopt.GetoptError, err:
            print str(err)
            sys.exit(1)
    
        for o,a in opts:
            if o in ("-v", "--verbose"):
                if a:
                    verbose=int(a)
                else:
                    verbose=1
                print "verbosity is %d" % (verbose)
    

    结果:

    $ ./testopt.py -v
    option -v requires argument
    $ ./testopt.py -v 1
    verbosity is 1
    
    5 回复  |  直到 10 年前
        1
  •  8
  •   SilentGhost    15 年前

    getopt 不支持可选参数。如果是长期期权,你可以这样做:

    $ ./testopt.py --verbose=
    

    这将导致空字符串值。

    你可以找到 argparse 模块更灵活。

        2
  •  5
  •   SilentGhost    15 年前

    不幸的是,没有办法。从 optparse docs :

    通常,一个给定的选项要么接受一个参数,要么不接受一个参数。很多人想要一个可选的选项参数,这意味着有些选项会接受一个参数,如果他们看到它,也会接受一个参数,如果他们不接受,也会接受一个参数。这是有争议的,因为它会使解析变得模棱两可:如果“-a”接受一个可选参数,而“-B“完全是另一种选择,我们如何解释”-AB“?由于这种模糊性,optparse不支持此功能。

    编辑: oops,也就是说,optparse模块没有getopt模块,但是两个模块都没有“可选选项参数”的原因对于这两个模块来说是相同的。

        3
  •  2
  •   tponthieux    13 年前

    您可以这样对getopt执行可选参数:

    import getopt
    import sys
    
    longopts, shortopts = getopt.getopt(sys.argv[1:], shortopts='', longopts=['env='])
    argDict = dict(longopts)
    
    if argDict.has_key('--env') and argDict['--env'] == 'prod':
        print "production"
    else:
        print "sandbox"
    

    用途:

    $ python scratch.py --env=prod
    production
    
    $ python scratch.py --env=dev
    sandbox
    
    $ python scratch.py
    sandbox
    
        4
  •  0
  •   PTBNL    15 年前

    如果您使用的是2.3或更高版本,您可能需要尝试 optparse 模块,因为它“更方便、更灵活、更强大……”,而且更新。唉,正如Pynt所回答的,似乎不可能得到你想要的。

        5
  •  0
  •   pixelbeat    10 年前

    python的getopt应该真的支持可选参数,比如gnu getopt,它需要“=” 指定参数时使用。现在你可以很容易地模拟它了, 通过隐式地将--option更改为--option=

    也就是说,您可以指定--option需要一个参数, 然后调整--option to--option=

    for i, opt in enumerate(sys.argv):
        if opt == '--option':
            sys.argv[i] = '--option='
        elif opt == '--':
            break