2014-06-17 18 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