Python中命令行參數(shù)解析器---argparse

本文的原文參考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的使用簡化成下面四個步驟

  1. import argparse #首先導(dǎo)入該模塊昌讲;
  2. parser = argparse.ArgumentParser() #然后創(chuàng)建一個解析對象
  3. parser.add_argument() #然后向該對象中添加你要關(guān)注的命令行參數(shù)和選項
  4. 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)

有兩種方式:

  1. 單下劃線 - 來指定的短參數(shù)饶碘,如-h;
  2. 雙下劃線 -- 來指定的長參數(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
  1. 測試直接運行文件洞拨,沒有輸入?yún)?shù)扯罐,所以默認(rèn)的args.verbosity的值應(yīng)該為0,所以輸出 turned off烦衣。
  2. 通過短參數(shù) -v指定參數(shù)歹河,并賦值 1,所以打印 turned on花吟。
  3. 通過短參數(shù) -v指定秸歧,但是沒有賦值,所以報錯衅澈,并給出了usage键菱。
  4. 打印help文件,給出了usage今布,并展示出了所有的可選參數(shù)(-h是函數(shù)自動生成的)经备。
  5. 通過長參數(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

  1. 輸入數(shù)字2搞乏,得到正確結(jié)果
  2. 輸入單詞two波桩,數(shù)據(jù)類型為str不正確,報錯请敦。
  3. 打印幫助信息镐躲。

程序用法幫助

前面介紹了為每個參數(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

  1. 沒有指定 -v的值裆熙,那么取默認(rèn)值端礼,即1。
  2. 指定了-v的值為0入录。
  3. 打印幫助信息蛤奥。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市僚稿,隨后出現(xiàn)的幾起案子凡桥,更是在濱河造成了極大的恐慌,老刑警劉巖蚀同,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缅刽,死亡現(xiàn)場離奇詭異,居然都是意外死亡蠢络,警方通過查閱死者的電腦和手機(jī)衰猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谢肾,“玉大人腕侄,你說我怎么就攤上這事÷瑁” “怎么了冕杠?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長酸茴。 經(jīng)常有香客問我分预,道長,這世上最難降的妖魔是什么薪捍? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任笼痹,我火速辦了婚禮,結(jié)果婚禮上酪穿,老公的妹妹穿的比我還像新娘凳干。我一直安慰自己,他們只是感情好被济,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布救赐。 她就那樣靜靜地躺著,像睡著了一般只磷。 火紅的嫁衣襯著肌膚如雪经磅。 梳的紋絲不亂的頭發(fā)上泌绣,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機(jī)與錄音预厌,去河邊找鬼阿迈。 笑死,一個胖子當(dāng)著我的面吹牛轧叽,可吹牛的內(nèi)容都是我干的苗沧。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼炭晒,長吁一口氣:“原來是場噩夢啊……” “哼崎页!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起腰埂,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蜈膨,沒想到半個月后屿笼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡翁巍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年驴一,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灶壶。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡肝断,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出驰凛,到底是詐尸還是另有隱情胸懈,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布恰响,位于F島的核電站趣钱,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏胚宦。R本人自食惡果不足惜首有,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枢劝。 院中可真熱鬧井联,春花似錦、人聲如沸您旁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽被冒。三九已至军掂,卻和暖如春轮蜕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蝗锥。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工跃洛, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人终议。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓汇竭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親穴张。 傳聞我的和親對象是個殘疾皇子细燎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345

推薦閱讀更多精彩內(nèi)容