??python argparse 用法總結(jié)

  • import argparse:首先導(dǎo)入模塊
  • parser = argparse.ArgumentParser(description="your script description"):創(chuàng)建一個(gè)解析對(duì)象,description 參數(shù)可以用于插入描述腳本用途的信息铃在,可以為空
  • parser.add_argument():向該對(duì)象中添加你要關(guān)注的命令行參數(shù)和選項(xiàng)
  • parser.parse_args():進(jìn)行解析

在多個(gè)文件或者不同語(yǔ)言協(xié)同的項(xiàng)目中躺酒,python 腳本經(jīng)常需要從命令行直接讀取參數(shù)蒸痹。下面我們通過幾個(gè)例子來學(xué)習(xí) argparse左敌。

我們先創(chuàng)建一個(gè)腳本 prog.py,然后輸入如下內(nèi)容:

import argparse
parser = argparse.ArgumentParser()
parser.parse_args()

下面我們?cè)?shell 中進(jìn)行測(cè)試:

1
  • 第 1 個(gè)沒有任何輸出和出錯(cuò)
  • 第 2初坠、3 個(gè)測(cè)試為打印幫助信息查排,argparse 會(huì)自動(dòng)生成幫助文檔,-h 為短寫
  • 第 4 個(gè)測(cè)試為未定義的 -v 參數(shù)驴剔,會(huì)出錯(cuò)
  • 第 5 個(gè)測(cè)試為未定義的參數(shù) df省古,出錯(cuò)

我們可以看出:prog.py 僅僅只有可選參數(shù) -help 與其短寫 -h,為了傳入更加復(fù)雜的參數(shù)丧失,下面我們需要借用 parser.add_argument()豺妓。

1 位置參數(shù)

positional arguments

用法是不用帶 -,改寫 prog.py

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("e")
args = parser.parse_args()
print(args.e)

測(cè)試結(jié)果:

2

定義了一個(gè)叫 e 的參數(shù),默認(rèn)必選琳拭,分析:

  • 第 1 個(gè)測(cè)試為不帶參數(shù)训堆,由于 e 參數(shù)為空,所以報(bào)錯(cuò)白嘁,并給出用法(usage)和錯(cuò)誤信息
  • 第 2 個(gè)測(cè)試為打印幫助信息
  • 第 3 個(gè)測(cè)試為正常用法坑鱼,回顯了輸入字符串 Hi

2 可選參數(shù)

optional arguments,有兩種方式:

  • - 指定的短參數(shù)絮缅,如 -h
  • -- 指定的長(zhǎng)參數(shù)鲁沥,如 --help

這兩種方式可以同存,也可以只存在一個(gè)耕魄,修改 prog.py 內(nèi)容如下:


import argparse

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", help="添加輸出 verbosity")
args = parser.parse_args()
if args.verbosity:
    print("打開 verbosity")

測(cè)試結(jié)果:

3

通過圖 3 我們很容易便明白可選參數(shù)的用法画恰,但是 -v 必須指定參數(shù)值,否則就會(huì)報(bào)錯(cuò)屎开,有沒有像 -h 那樣阐枣,不需要指定參數(shù)值的呢,答案是有奄抽,通過定義參數(shù)時(shí)指定action="store_true" 即可蔼两,用法如下:

import argparse


parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="增加輸出 verbosity",
                    action="store_true")
args = parser.parse_args()
if args.verbose:
    print("打開 verbosity")

測(cè)試結(jié)果:

4

-v 沒有指定任何參數(shù)也可,其實(shí)存的是 TrueFalse逞度,如果出現(xiàn)额划,則其值為True,否則為 False

5

3 類型 type

默認(rèn)的參數(shù)類型為 str档泽,如果要進(jìn)行數(shù)學(xué)計(jì)算俊戳,需要在參數(shù)進(jìn)行解析后進(jìn)行類型轉(zhuǎn)換,如果不能轉(zhuǎn)換則會(huì)報(bào)錯(cuò):

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('x', type=int, help="輸入數(shù)字")
args = parser.parse_args()
y = args.x
answer = y ** 3 + y + 1
print(answer)

測(cè)試與結(jié)果:

6

4 可選值 choices=[]

2 中的 action 的例子中定義了默認(rèn)值為 TrueFalse 的方式馆匿,如果要限定某個(gè)值的取值范圍抑胎,比如 3 中的整型,限定其取值范圍為 0, 1, 2:

import argparse

parser = argparse.ArgumentParser()
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],
                    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)

測(cè)試結(jié)果:

7

5 程序用法幫助

argparse.ArgumentParser(description="calculate X to the power of Y")

import argparse

parser = argparse.ArgumentParser(description="calculate X to the power of Y")
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
parser.add_argument("x", type=int, help="the base")
parser.add_argument("y", type=int, help="the exponent")
args = parser.parse_args()
answer = args.x**args.y

if args.quiet:
    print(answer)
elif args.verbose:
    print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
    print("{}^{} == {}".format(args.x, args.y, answer))

打印幫助信息時(shí)即顯示 calculate X to the power of Y

8

6 互斥參數(shù)

上個(gè)例子中定義了互斥參數(shù):

group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")

第 4 行定義了一個(gè)互斥組渐北,第 5, 6 行在互斥組中添加了 -v-q 兩個(gè)參數(shù)阿逃,用上個(gè)例子中的程序進(jìn)行如下測(cè)試:

9

可以看出,-q-v 不出現(xiàn)赃蛛,或僅出現(xiàn)一個(gè)都可以恃锉,同時(shí)出現(xiàn)就會(huì)報(bào)錯(cuò)。

7 參數(shù)默認(rèn)值

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)

測(cè)試結(jié)果如下:

10

更多詳細(xì)內(nèi)容見:argparse — d2py 0.1 文檔 (xinetzone.github.io)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載呕臂,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者破托。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市歧蒋,隨后出現(xiàn)的幾起案子土砂,更是在濱河造成了極大的恐慌州既,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瘟芝,死亡現(xiàn)場(chǎng)離奇詭異易桃,居然都是意外死亡褥琐,警方通過查閱死者的電腦和手機(jī)锌俱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敌呈,“玉大人贸宏,你說我怎么就攤上這事】暮椋” “怎么了吭练?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)析显。 經(jīng)常有香客問我鲫咽,道長(zhǎng),這世上最難降的妖魔是什么谷异? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任分尸,我火速辦了婚禮,結(jié)果婚禮上歹嘹,老公的妹妹穿的比我還像新娘箩绍。我一直安慰自己,他們只是感情好尺上,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布材蛛。 她就那樣靜靜地躺著,像睡著了一般怎抛。 火紅的嫁衣襯著肌膚如雪卑吭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天马绝,我揣著相機(jī)與錄音豆赏,去河邊找鬼。 笑死迹淌,一個(gè)胖子當(dāng)著我的面吹牛河绽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播唉窃,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼耙饰,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了纹份?” 一聲冷哼從身側(cè)響起苟跪,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤廷痘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后件已,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笋额,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年篷扩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了兄猩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鉴未,死狀恐怖枢冤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情铜秆,我是刑警寧澤淹真,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站连茧,受9級(jí)特大地震影響核蘸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜啸驯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一客扎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧坯汤,春花似錦虐唠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至搓幌,卻和暖如春杆故,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背溉愁。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工处铛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拐揭。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓撤蟆,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親堂污。 傳聞我的和親對(duì)象是個(gè)殘疾皇子家肯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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