2014-06-17 16 views
3

我一直在寻找argparse文档,但我仍然困惑如何使用它。 我做了一个python脚本,以便在代码分析后从pmd,checkstyle或findbugs中获取问题。这些问题也被归类为严重性,拦截性和批判性等严重性。在Python中传递argparse的多个选项

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

因此,举例来说,如果我在终端写python script.py pf cb,我会得到关键的拦截严重的PMD和FindBugs的问题。

这将是真棒,如果有人可以给我的这个应该怎么走的总体结构。

谢谢。

+0

如果没有绑定到argparse,但你只是想为CMD一些工具,尝试docopt:http://docopt.org/我不知道认为太好了,所以这是我的帮助;) –

回答

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

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) 

假设你刚刚通过严重性级别的检查以某种方式。

+0

我同意这是更传统的方法。 –

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