我有一个Python应用程序,如下所示:
$ app.py -a arg1 -a arg2 -b file1.b -b file2.b根据选项的不同,在app.py中,我使用两个不同的函数来处理输入文件。因为每个选项可以有几个文件参数,所以我希望是这样的:
$ app.py -a arg1 arg2 -b *.b在网上搜索后,我找到了这三个模块: getopt,argparse,optparse
我为我的应用程序写了一个简单的例子:
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)我的问题是:有没有其他的模块或更好的方法来做到这一点?
发布于 2013-05-05 01:44:12
自2012年以来,Python有了一个简单、强大且非常酷的参数解析模块,称为docopt。它可以在2.5到3.3版本的Python上运行,不需要安装。以下是针对您的特定情况的代码:
'''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 这就是它:一行代码加上您的文档字符串,这是必不可少的。我告诉过你这很酷--不是吗;-)
发布于 2011-07-22 11:29:35
如果你发现argparse太难入门了,因为它太复杂了,那么你可能会喜欢PyPi上的plac。它是一个围绕argparse的包装器,它隐藏了复杂性,并为您处理了大量样板参数检查。
它适用于Python2和Python3,并且有一个装饰器,允许Python2用户访问Python3函数参数的一个很好的特性。您甚至可以将命令相互嵌套,这样就可以在一个命令行上使用-arguments (以破折号开头)和.arguments (以点开头)。
这里是文档http://plac.googlecode.com/hg/doc/plac.html
发布于 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')
https://stackoverflow.com/questions/6785194
复制相似问题