在Python中为argparse传递多个选项
我一直在看argparse的文档,但还是搞不清楚怎么用。
我写了一个Python脚本,用来在代码分析后获取pmd、checkstyle或findbugs的问题。这些问题还会根据严重程度分为几类,比如主要问题、阻塞问题和严重问题。
所以我想能够通过这样的方式传入两个参数:python script.py arg1 arg2
,其中arg1
是由p,c,f
组合而成,分别代表pmd、checkstyle和findbug,而arg2
是由m,c,b
组合而成,分别代表主要问题、严重问题和阻塞问题。
举个例子,如果我在终端输入python script.py pf cb
,那么我就会得到pmd和findbugs的严重和阻塞问题。
如果有人能给我一个大致的结构,告诉我该怎么做,那就太好了。
谢谢!
3 个回答
https://stackoverflow.com/users/1401034/ewan 提供了一个不错的解决方案,符合你的要求。不过稍微改动一下,可以给用户更多选择,可能会更清晰。
parser = argparse.ArgumentParser()
parser.add_argument('-p', '--pmd', action='store_true')
parser.add_argument('-c', '--checkstyle', action='store_true')
parser.add_argument('-f', '--findbug', action='store_true')
parser.add_argument('-m', '--major', action='store_true')
parser.add_argument('-d', '--critical', action='store_true')
parser.add_argument('-b', '--blocker', action='store_true')
args = parser.parse_args()
print args
示例运行结果:
1840:~/mypy$ python2.7 stack24265375.py -cfmd
Namespace(blocker=False, checkstyle=True, critical=True, findbug=True, major=True, pmd=False)
1841:~/mypy$ python2.7 stack24265375.py -h
usage: stack24265375.py [-h] [-p] [-c] [-f] [-m] [-d] [-b]
optional arguments:
-h, --help show this help message and exit
-p, --pmd
-c, --checkstyle
-f, --findbug
-m, --major
-d, --critical
-b, --blocker
1842:~/mypy$ python2.7 stack24265375.py --critical --major
Namespace(blocker=False, checkstyle=False, critical=True, findbug=False, major=True, pmd=False)
在这个例子中,有6个可选的布尔标志(也就是对或错的选项)。这些简短的单字母选项可以随意组合在一起。除了必须的 '-'
符号外,这种形式看起来和使用两个位置参数的形式一样。但它们可以随意混合搭配。而且长形式的参数说明也很清楚。
如果把这6个参数分成两组,帮助信息可能会更清晰。
parser = argparse.ArgumentParser()
group1 = parser.add_argument_group('issue')
group1.add_argument('-p', '--pmd', action='store_true')
group1.add_argument('-c', '--checkstyle', action='store_true')
group1.add_argument('-f', '--findbug', action='store_true')
group2 = parser.add_argument_group('severity')
group2.add_argument('-m', '--major', action='store_true')
group2.add_argument('-d', '--critical', action='store_true')
group2.add_argument('-b', '--blocker', action='store_true')
args = parser.parse_args()
print args
帮助信息:
usage: stack24265375.py [-h] [-p] [-c] [-f] [-m] [-d] [-b]
optional arguments:
-h, --help show this help message and exit
issue:
-p, --pmd
-c, --checkstyle
-f, --findbug
severity:
-m, --major
-d, --critical
-b, --blocker
也许你更希望用户能更详细地指定标志,比如这样?
python script.py --checker p --checker f --level c --level b
如果是这样的话,你可以使用 append
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--checker', action='append')
>>> parser.add_argument('--level', action='append')
这样你就能得到一个参数检查器和等级,它们都是可以循环遍历的列表。
如果你真的想使用组合标志:
for c in arg1:
run_checker(c, arg2)
假设你只是以某种方式将严重性等级传递给检查器。
你可以尝试设置布尔标志,来检查每个选项是否在参数中:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("pcf", help="pmd, checkstyle, or findbug")
parser.add_argument("mcb", help="major, critical, and blocker")
args = parser.parse_args()
# Use boolean flags
pmd = 'p' in args.pcf
checkstyle = 'c' in args.pcf
findbug = 'f' in args.pcf
major = 'm' in args.mcb
critical = 'c' in args.mcb
blocker = 'b' in args.mcb
这样的话,你可以用 python script.py pf cb
来运行。
另外,这里有个小提示。如果你在你的 Python 文件顶部加上以下内容,然后用 chmod +x script.py
让它变成可执行文件,你就可以直接调用这个文件了(在 *NIX 操作系统上):
#!/usr/bin/env python
import argparse
...
现在你可以用 ./script.py pf cb
来运行,或者把它放到你的路径中,然后用 script.py pf cb
来调用。