本文的原文參考https://juejin.im/post/5c6958fd6fb9a049ff4eab60纠拔;http://www.liujiangblog.com/blog/16/
當(dāng)你在服務(wù)端(比如linux)要運行一個工具或服務(wù)(python文件)時,需要輸入?yún)?shù)植阴。如果以命令還來執(zhí)行就需要寫一個命令行參數(shù)解析模塊。argparse是最常用的python命令行解析器万搔。它支持解析一參數(shù)多值魁索,可以自動生成help命令和幫助文檔迈勋,支持子解析器胆描,支持限制參數(shù)取值范圍等等功能瘫想。
使用步驟
我們常常可以把a(bǔ)rgparse的使用簡化成下面四個步驟
- import argparse #首先導(dǎo)入該模塊昌讲;
- parser = argparse.ArgumentParser() #然后創(chuàng)建一個解析對象
- parser.add_argument() #然后向該對象中添加你要關(guān)注的命令行參數(shù)和選項
- parser.parse_args() #最后調(diào)用parse_args()方法進(jìn)行解析国夜,將返回帶有某些屬性的對象,組成一個類(不太確定)短绸?
例如:
# mytest.py
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("name")
args = parser.parse_args()
print(args.name)
參數(shù)種類
必選參數(shù)(positional arguments)
例如上面例子中用str
作為參數(shù)"name"车吹,默認(rèn)參數(shù)是必選參數(shù)筹裕,命令行運行的時必須輸入?yún)?shù)。比如不指定name參數(shù)運行python mytest.py
礼搁,會報錯:
[root@localhost ~]# python mytest.py
usage: mytest.py [-h] name
mytest.py: error: too few arguments
[root@localhost ~]#
必須指定參數(shù)運行python mytest.py wangbm
:
[root@localhost ~]# python mytest.py wangbm
wangbm
[root@localhost ~]#
可選參數(shù)(optional arguments)
有兩種方式:
- 單下劃線 - 來指定的短參數(shù)饶碘,如-h;
- 雙下劃線 -- 來指定的長參數(shù)馒吴,如--help
下面給出一個例子:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="increase output verbosity")
#定義了一個可選參數(shù) '-v'或者說'--verbosity'
#help="increase output verbosity"給出了可選參數(shù)'-v'的help文件描述。
args = parser.parse_args() #通過解析后瑟曲,其值保存到args.verbosity中饮戳。
if args.verbosity:
print ("verbosity turned on")
else:
print ("verbosity turned off")
上面的例子中我們定義了一個可選參數(shù) --verbosity
。在命令行中運行測試得到:
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py
verbosity turned off
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -v 1
verbosity turned on
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -v
usage: arg.py [-h] [-v VERBOSITY]
arg.py: error: argument -v/--verbosity: expected one argument
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -h
usage: arg.py [-h] [-v VERBOSITY]
optional arguments:
-h, --help show this help message and exit
-v VERBOSITY, --verbosity VERBOSITY
increase output verbosity
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py --verbosity 1
verbosity turned on
- 測試直接運行文件洞拨,沒有輸入?yún)?shù)扯罐,所以默認(rèn)的args.verbosity的值應(yīng)該為0,所以輸出 turned off烦衣。
- 通過短參數(shù) -v指定參數(shù)歹河,并賦值 1,所以打印 turned on花吟。
- 通過短參數(shù) -v指定秸歧,但是沒有賦值,所以報錯衅澈,并給出了usage键菱。
- 打印help文件,給出了usage今布,并展示出了所有的可選參數(shù)(-h是函數(shù)自動生成的)经备。
- 通過長參數(shù) --verbosity指定了參數(shù)。
參數(shù)的數(shù)據(jù)類型
默認(rèn)的參數(shù)類型為str部默,如果要進(jìn)行數(shù)學(xué)計算侵蒙,需要對參數(shù)進(jìn)行解析后進(jìn)行類型轉(zhuǎn)換,如果不能轉(zhuǎn)換則需要報錯傅蹂,這樣比較麻煩纷闺。
argparse提供了對參數(shù)類型的解析,如果類型不符合贬派,則直接報錯急但。如下是對參數(shù)進(jìn)行平方計算的程序:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('x', type=int, help="the base")
args = parser.parse_args()
answer = args.x ** 2
print answer
上面的程序中對參數(shù)x
指定了護(hù)具類型type=int
。在命令行中進(jìn)行測試:
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py 2
4
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py two
usage: arg.py [-h] x
arg.py: error: argument x: invalid int value: 'two'
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -h
usage: arg.py [-h] x
positional arguments:
x the base
optional arguments:
-h, --help show this help message and exit
- 輸入數(shù)字2搞乏,得到正確結(jié)果
- 輸入單詞two波桩,數(shù)據(jù)類型為str不正確,報錯请敦。
- 打印幫助信息镐躲。
程序用法幫助
前面介紹了為每個參數(shù)定義幫助文檔储玫,那么給整個程序定義幫助文檔該怎么進(jìn)行呢? 通過創(chuàng)建時候?qū)懭雂escription就可以萤皂。比如上個例子中撒穷,可以定義argparse.ArgumentParser(description="calculate X to the power of Y")。
默認(rèn)參數(shù)值
也可以定義默認(rèn)參數(shù):
import argparse
parser = argparse.ArgumentParser(description="calculate X to the power of Y")
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2], default=1,
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbosity == 2:
print "the square of {} equals {}".format(args.square, answer)
elif args.verbosity == 1:
print "{}^2 == {}".format(args.square, answer)
else:
print answer
測試結(jié)果如下
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py 8
8^2 == 64
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py 8 -v 0
64
(python2) C:\Users\xcui\PycharmProjects\test>python arg.py -h
usage: arg.py [-h] [-v {0,1,2}] square
calculate X to the power of Y
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v {0,1,2}, --verbosity {0,1,2}
increase output verbosity
- 沒有指定 -v的值裆熙,那么取默認(rèn)值端礼,即1。
- 指定了-v的值為0入录。
- 打印幫助信息蛤奥。