python中的argparse,pythonargparse
argparse是python用於解析命令列參數和選項的標準模組,用於代替已經過時的optparse模組。argparse模組的作用是用於解析命令列參數。
最基礎的,從一個最簡單的程式開始:
import argparseparser = argparse.ArgumentParser()
運行結果:
$ python 1.py$
定位參數:
import argparseparser=argparse.ArgumentParser()parser.add_argument("echo")parser.add_argument("hello")args = parser.parse_args()print args.ehco
運行:
$python 1.pyusage: 1.py [-h] echo hello1.py: error: too few arguments$python 1.py echousage: 1.py [-h] echo hello1.py: error: too few arguments$python 1.py echo helloecho
方法add_argument()
,用來指定程式需要接受的命令參數;
並且argparse是預設字串,如果以數字形式輸入會報錯,如下面代碼所示:
1 import argparse2 parser=argparse.ArgumentParser()3 parser.add_argument("echo", help="echo the string you use here")4 args=parser.parse_args()5 print args.echo*10
運行:
$ python 1.py 4Traceback (most recent call last): File "1.py", line 5, in <module> print args.square**2TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
必須將代碼增加type=你需要的類型(像這裡需要int類型):
1 import argparse2 parser=argparse.ArgumentParser()3 parser.add_argument("echo", help="echo the string you use here", type=int)4 args=parser.parse_args()5 print args.echo*10
--help:
雖然現在協助資訊已經很美觀了,但是還不夠好。例如我們知道echo是個定位參數,但是卻不知道該參數的意思,只能通過猜或者讀源碼。下面,我們可以讓它更有協助:
1 import argparse2 parser = argparse.ArgumentParser()3 parser.add_argument("echo", help="echo the string you use there")4 args = parser.parser_args()5 print args.echo
運行:
1 $ python 1.py -h2 usage: 1.py [-h] echo3 4 positional arguments:5 echo echo the string you use here6 7 optional arguments:8 -h, --help show this help message and exit
參考類型:
一般來說,如果不指定參數類型的話,argparse預設為字串類型,可以通過type來指定;
1 import argparse2 parser = argparse.ArgumentParser()3 parser.add_argument("square", help="display a square of a given number", type=int)4 args = parser.parse_args()5 print args.square**2
還可以使用default=xx來指定預設參數的值,例如:
1 parser.add_argument("echo", action="count", default=0)
選擇性參數:
1 import argparse2 parser = argparse.ArgumentParser()3 parser.add_argument("--verbosity", help="increase output verbosity")4 args = parser.parse_args()5 if args.verbosity:6 print "verbosity turned on"
運行:
$ python 1.py --verbosity 1verbosity turned on$ python 1.py$ python 1.py --helpusage: prog.py [-h] [--verbosity VERBOSITY]
關於選擇性參數還有一個簡寫:
1 import argparse2 parser = argparse.ArgumentParser()3 parser.add_argument("-vwww", "--verbose", help="increase output verbosity", action="store_true")4 args = parser.parse_args()5 if args.verbose:6 print "verbosity turned on"
這裡的-vww就是其簡寫,action: store_true / store_false:布爾開關。 store_true.預設為False,輸入則為true。 store_flase 相反;
1 $ python prog.py -v2 verbosity turned on3 $ python prog.py --help4 usage: prog.py [-h] [-v]5 6 optional arguments:7 -h, --help show this help message and exit8 -v, --verbose increase output verbosity
在命令列中只要-v和-vwww前面一致就行,如果是-vp就會報錯;如果是-vw,預設是-vwww,也個23是正確的;
注意:
1 parser.add_argument("-v", "--verbose", action="store_true",help="increase output verbosity")
這些是沒有順序的,當然也可以像上面一樣了;
參數衝突:
迄今為止,我們已經使用到了[argparse.ArgumentParser][6]
的兩個方法,來看看他的另一個方法add_mutually_exclusive_group()
。它可以讓我們指定某個參數和其他參數衝突。下面來修改下程式以對這個新方法有更多的瞭解:我們將加入參數--quiet
,它和參數--verbose
衝突,不能同時指定:
1 import argparse 2 parser = argparse.ArgumentParser() 3 parser.add_argument("-v", "--verbose", type=int, help="the base") 4 parser.add_argument("-q", "--quiet", type=int, help="the exponent") 5 6 args = parser.parse_args() 7 if args.quiet: 8 print "111111" 9 elif args.verbose:10 print "222222"
運行:
1 $python 1.py -v -q2 $11111
另一個方法add_mutually_exclusive_group():
1 import argparse2 3 parser = argparse.ArgumentParser()4 group = parser.add_mutually_exclusive_group()5 group.add_argument("-v", "--verbose", action="store_true")6 group.add_argument("-q", "--quiet", action="store_true")
7 if args.quiet:
8 print "111111"
9 elif args.verbose:
10 print "222222"
運行:
1 python 1.py -v -q2 usage: 1.py [-h] [-v | -q]3 test.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
表明了可以使用-v
或者-q
,但是不能同時使用。