在Python中传递argparse的多个选项

时间:2014-06-17 13:39:16

标签: python argparse

我一直在研究argparse文档,但我仍然对如何使用它感到困惑。 我做了一个python脚本,在代码分析后从pmd,checkstyle或findbugs中获取问题。这些问题也被分类为严重性,阻塞性和严重性等严重性。

所以我希望能够以python script.py arg1 arg2形式传递两个参数,其中arg1将是p,c,f的组合,代表pmd,checkstyle或findbug和{{ 1}}将是arg2的组合,代表主要,关键和阻止。

因此,例如,如果我在终端中写m,c,b,我会得到pmd和findbugs关键和阻塞严重性的问题。

如果有人可以给我一个如何应用的一般结构,那将是非常棒的。

感谢。

3 个答案:

答案 0 :(得分:3)

也许你宁愿让用户指定更详细的标志,比如这个?

python script.py --checker p --checker f --level c --level b

如果是,您可以使用追加

>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--checker', action='append')
>>> parser.add_argument('--level', action='append')

然后你得到一个参数检查器和级别,作为迭代的列表。

如果你真的想使用组合标志:

for c in arg1:
    run_checker(c, arg2)

假设您只是以某种方式将严重性级别传递给检查程序。

答案 1 :(得分: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

答案 2 :(得分:1)

根据您的规范,

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个可选的布尔标志。简短的单字母版本可以任意组合串联在一起。除了必要的'-'之外,此表单看起来就像使用2个位置参数的表单。但它们可以任意组合混合和匹配。长篇形式是自我记录。

如果将这6个参数分成2个参数组,则帮助显示可能会更清晰。

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