-
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 個(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é)果:
定義了一個(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 我們很容易便明白可選參數(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é)果:
-v
沒有指定任何參數(shù)也可,其實(shí)存的是 True
和 False
逞度,如果出現(xiàn)额划,則其值為True
,否則為 False
:
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é)果:
4 可選值 choices=[]
2 中的 action
的例子中定義了默認(rèn)值為 True
和 False
的方式馆匿,如果要限定某個(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é)果:
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
:
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è)試:
可以看出,-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é)果如下:
更多詳細(xì)內(nèi)容見:argparse — d2py 0.1 文檔 (xinetzone.github.io)