首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中,当每个选项可以有多个参数时,有没有更好的方法来处理命令行选项

在Python中,当每个选项可以有多个参数时,有没有更好的方法来处理命令行选项
EN

Stack Overflow用户
提问于 2011-07-22 10:58:44
回答 3查看 306关注 0票数 1

我有一个Python应用程序,如下所示:

代码语言:javascript
复制
$ app.py -a arg1 -a arg2 -b file1.b -b file2.b

根据选项的不同,在app.py中,我使用两个不同的函数来处理输入文件。因为每个选项可以有几个文件参数,所以我希望是这样的:

代码语言:javascript
复制
$ app.py -a arg1 arg2 -b *.b

在网上搜索后,我找到了这三个模块: getopt,argparse,optparse

我为我的应用程序写了一个简单的例子:

代码语言:javascript
复制
optionDict= {'-a':aFunction, '-b':bFunction}
for arg in sys.argv[1:]:
    if arg in optionDict: # arg is an option here.
        funcName = optionDict[arg]
    else: # arg is not an option, then it's a fileName. Deal with this file with the function found according to previous arg.
        funcName(arg)

我的问题是:有没有其他的模块或更好的方法来做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-05 01:44:12

自2012年以来,Python有了一个简单、强大且非常酷的参数解析模块,称为docopt。它可以在2.5到3.3版本的Python上运行,不需要安装。以下是针对您的特定情况的代码:

代码语言:javascript
复制
'''app.py

Usage:
  app.py -a ARG ... -b FILE ...
  app.py (-h | -v) 

'''
from docopt import docopt
args = docopt(__doc__, version='1.0')
# now do something based on the value of args dict 

这就是它:一行代码加上您的文档字符串,这是必不可少的。我告诉过你这很酷--不是吗;-)

票数 2
EN

Stack Overflow用户

发布于 2011-07-22 11:29:35

如果你发现argparse太难入门了,因为它太复杂了,那么你可能会喜欢PyPi上的plac。它是一个围绕argparse的包装器,它隐藏了复杂性,并为您处理了大量样板参数检查。

它适用于Python2和Python3,并且有一个装饰器,允许Python2用户访问Python3函数参数的一个很好的特性。您甚至可以将命令相互嵌套,这样就可以在一个命令行上使用-arguments (以破折号开头)和.arguments (以点开头)。

这里是文档http://plac.googlecode.com/hg/doc/plac.html

票数 1
EN

Stack Overflow用户

发布于 2011-07-22 16:19:33

我认为argparse是最好的选择。它做了很好的工作,它很容易使用,并且是从2.7开始的标准库。看一看nargs的论点。从docs

要消耗的固定元素

解析器= argparse.ArgumentParser() parser.add_argument(' --foo ',nargs=2) parser.add_argument('bar',nargs=1) parser.parse_args('c --foo a b'.split())命名空间(bar=‘c’,foo='a','b')

如果可能,将从命令行使用一个arg,并将其作为单个项目生成。如果不存在命令行arg,则将生成默认值

解析器= argparse.ArgumentParser() parser.add_argument(' --foo ',nargs='?',const='c',default='d') parser.add_argument('bar',nargs='?',default='d') parser.parse_args('XX --foo YY'.split())命名空间(bar=‘XX’,foo='YY') parser.parse_args('XX --foo'.split())命名空间(bar=‘XX’,foo='c') parser.parse_args(''.split())命名空间(bar=‘d’,foo='d')

存在的所有命令行参数都被收集到一个列表中。

解析器= argparse.ArgumentParser() parser.add_argument(' --foo ',nargs='*') parser.add_argument(' --bar ',nargs='*') parser.add_argument('baz',nargs='*') parser.parse_args('a b--foo x y--bar 1 2‘..split())命名空间(bar=’1‘,'2',baz='a','b',foo='x','y')

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6785194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档