argparse是 Python 標(biāo)準(zhǔn)庫中推薦的命令行解析模塊晨逝。它可以讓人輕松編寫用戶友好的命令行接口。對于深度學(xué)習(xí)等需要大量更換參數(shù)的工作懦铺,它可以將參數(shù)和代碼分開捉貌,讓工作更加簡潔。本文主要參考官方文檔冬念,并根據(jù)官方文檔重新進行了一些梳理趁窃。
1 創(chuàng)建一個 ArgumentParser對象
import argparse
parser = argparse.ArgumentParser()
2 位置參數(shù)
位置參數(shù):基于位置的參數(shù)。如定義一個函數(shù)def multiply(m,n), m和n就是位置參數(shù)急前。在argparse中醒陆,判斷位置參數(shù)的方法非常簡單,即不需要前綴以 - 或 -- 開頭的都是位置參數(shù)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print(args.echo)
我們將上述文件保存為prog.py裆针。 對于mac系統(tǒng)的話刨摩,假設(shè)我們將文件保存于桌面寺晌,打開終端,按照如下程序運行澡刹。若保存于別的位置可以將prog.py文件拖入終端折剃,可以直接顯示文件的絕對路徑。
$ cd /Users/xxx/Desktop
$ python3 prog.py --help
usage: prog.py [-h] echo
positional arguments:
echo
optional arguments:
-h, --help show this help message and exit
通過help屬性我們發(fā)現(xiàn)像屋,位置參數(shù)為echo怕犁,可選參數(shù)為-h,--help己莺,實際上-h為--help的簡寫奏甫,這個后面會說到。
$ python3 prog.py
usage: prog.py [-h] echo
prog.py: error: the following arguments are required: echo
這時我們發(fā)現(xiàn)程序報錯凌受。這是因為位置參數(shù)需要制定內(nèi)容阵子。我們不妨給echo隨意指定一個詞 'foo'
$ python3 prog.py foo
foo
接下來我們可以繼續(xù)豐富echo屬性的功能
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="echo the string you use here")
args = parser.parse_args()
print(args.echo)
$ python3 prog.py -h
usage: prog.py [-h] echo
positional arguments:
echo echo the string you use here
optional arguments:
-h, --help show this help message and exit
相比之前,除了位置參數(shù)和可選參數(shù)胜蛉,我們還看到了對位置參數(shù)echo的描述挠进。
接下來我們定義一些更有實際意義的屬性
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number")
args = parser.parse_args()
print(args.square**2)
$ python3 prog.py 4
Traceback (most recent call last):
File "prog.py", line 13, in <module>
print(args.square**2)
TypeError: unsupported operand type(s) for ** or pow(): 'str' and 'int'
報錯,因為程序把輸入自動處理成了str誊册,而str是不能做數(shù)值運算了领突,我們告訴 argparse來把這一輸入視為整數(shù)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number",
type=int)
args = parser.parse_args()
print(args.square**2)
$ python3 prog.py 4
16
3 可選參數(shù)
可選參數(shù):在argparse中,凡是用 - 或者 -- 開頭定義的命令行參數(shù)案怯。這里有一個約定俗成的慣例:單個字母只是用一個 - 君旦,多個字母使用兩個 - (--)。對于可選參數(shù)來說嘲碱,如果沒有被使用的話金砍,如就默認為None,下面我們來定義一個可選參數(shù)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity", help="increase output verbosity")
args = parser.parse_args()
if args.verbosity:
print("verbosity turned on")
test1
$ python3 prog.py --verbosity 1
verbosity turned on
我們給verbosity指定1麦锯,if條件判斷為True
test2
$ python3 prog.py
我們沒有使用verbosity屬性恕稠,args.verbosity == None,if條件判斷為false
test3
$ python3 prog.py --verbosity
usage: prog.py [-h] [--verbosity VERBOSITY]
prog.py: error: argument --verbosity: expected one argument
我們使用了verbosity屬性扶欣,但是沒有給其賦值鹅巍,報錯
上述例子接受任何整數(shù)值作為 --verbosity 的參數(shù),但對于我們的簡單程序而言宵蛀,只有兩個值有實際意義:True 或者 False昆著。讓我們據(jù)此修改代碼:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
現(xiàn)在指定了一個新的關(guān)鍵詞 action,并賦值為 "store_true"术陶。這意味著凑懂,當(dāng)這一選項存在時,為 args.verbose 賦值為 True梧宫。沒有指定時則隱含地賦值為 False
test1
$ python3 prog.py --verbose
verbosity turned on
test2
$ python3 prog.py --verbose 1
usage: prog.py [-h] [--verbose]
prog.py: error: unrecognized arguments: 1
給verbose指定了具體的值報錯
test3
$ python3 prog.py --help
usage: prog.py [-h] [--verbose]
optional arguments:
-h, --help show this help message and exit
--verbose increase output verbosity
4 短選項
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", help="increase output verbosity",
action="store_true")
args = parser.parse_args()
if args.verbose:
print("verbosity turned on")
這里-v為--verbose的縮寫接谨,
$ python3 prog.py -v
verbosity turned on
我們通過-v也可以調(diào)用verbose屬性
$ python3 prog.py --help
usage: prog.py [-h] [-v]
optional arguments:
-h, --help show this help message and exit
-v, --verbose increase output verbosity
5 結(jié)合位置參數(shù)和可選參數(shù)
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number") #增加一個位置參數(shù)
parser.add_argument("-v", "--verbose", action="store_true",
help="increase output verbosity") #增加一個可選參數(shù)
args = parser.parse_args()
answer = args.square**2
if args.verbose:
print("the square of {} equals {}".format(args.square, answer))
else:
print(answer)
test1
$ python3 prog.py
usage: prog.py [-h] [-v] square
prog.py: error: the following arguments are required: square
沒有給位置參數(shù)square指定值
test2
$ python3 prog.py 4
16
沒有使用可選參數(shù)摆碉,位置參數(shù)傳入4
test3
$ python3 prog.py 4 --verbose
the square of 4 equals 16
使用了可選參數(shù)verbose,位置參數(shù)square為4
test4
$ python3 prog.py --verbose 4
the square of 4 equals 16
改變傳入?yún)?shù)的順序脓豪,結(jié)果不變
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
假設(shè)我們想限定verbose的輸入選擇
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") #這里我們限定verbose只接受三個input:0 , 1, 2
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)
test
$ python3 prog.py 4 -v 3
usage: prog.py [-h] [-v {0,1,2}] square
prog.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
給verbose傳入3程序報錯
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
我們引入了另一種動作 count巷帝,來數(shù)某一個可選參數(shù)出現(xiàn)了幾次
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display the square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
help="increase output verbosity") #這里action從store_ture變成了count
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)
$ python3 prog.py 4 #0次
16
$ python3 prog.py 4 -v #1次
4^2 == 16
$ python3 prog.py 4 -vv #2次
the square of 4 equals 16
$ python3 prog.py 4 --verbosity --verbosity #2次
the square of 4 equals 16
$ python3 prog.py 4 -v 1
usage: prog.py [-h] [-v] square
prog.py: error: unrecognized arguments: 1
$ python3 prog.py 4 -h
usage: prog.py [-h] [-v] square
positional arguments:
square display a square of a given number
optional arguments:
-h, --help show this help message and exit
-v, --verbosity increase output verbosity
$ python3 prog.py 4 -vvv #三次
16
對于上述程序做進一步改進,我們想統(tǒng)計所有大于等于0的次數(shù)
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count",
help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
# bugfix: replace == with >=
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)
$ python3 prog.py 4 -vvv
the square of 4 equals 16
$ python3 prog.py 4 -vvvv
the square of 4 equals 16
$ python3 prog.py 4
Traceback (most recent call last):
File "prog.py", line 11, in <module>
if args.verbosity >= 2:
TypeError: '>=' not supported between instances of 'NoneType' and 'int'
我們看到最后一次報錯扫夜,這是因為不使用verbosity屬性的話默認值是None楞泼,而None是不能進行數(shù)值比較的,所以不妨令不使用verbosity的默認值為0
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
help="display a square of a given number")
parser.add_argument("-v", "--verbosity", action="count", default=0,
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)
再次測試
$ python3 prog.py 4
16
Reference:
[https://docs.python.org/zh-cn/3/library/argparse.html]
[https://docs.python.org/zh-cn/3/howto/argparse.html]