在Python中为argparse传递多个选项

3 投票
3 回答
1224 浏览
提问于 2025-04-18 10:04

我一直在看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 个回答

2

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
3

也许你更希望用户能更详细地指定标志,比如这样?

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)

假设你只是以某种方式将严重性等级传递给检查器。

2

你可以尝试设置布尔标志,来检查每个选项是否在参数中:

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 来调用。

撰写回答