Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解
一、argparse是什么?
argparse 是 Python 的一個(gè)標(biāo)準(zhǔn)庫(kù),用于命令行參數(shù)的解析,這意味著我們無(wú)需在代碼中手動(dòng)為變量賦值
而是可以直接在命令行中向程序傳遞相應(yīng)的參數(shù),再由變量去讀取這些參數(shù)。
如果沒(méi)有安裝 argparse,可執(zhí)行如下命令進(jìn)行安裝
pip install argparse
使用時(shí)只需導(dǎo)入
import argparse
1.1 一個(gè)例子
我們先來(lái)看一個(gè)最簡(jiǎn)單的例子,了解了使用 argparse 的大致步驟后,再來(lái)詳細(xì)介紹各個(gè)API。
""" 求解兩數(shù)之和 """
twoSum = lambda x, y: x + y
parser = argparse.ArgumentParser()
parser.add_argument('--a', type=int, required=True, help="first number")
parser.add_argument('--b', type=int, required=True, help="second number")
args = parser.parse_args()
first_num, second_num = args.a, args.b
print(twoSum(first_num, second_num))將以上內(nèi)容保存到 demo.py 中。我們先在命令行執(zhí)行
python3 demo.py -h
可以看到相應(yīng)的幫助信息
usage: demo.py [-h] --a A --b B options: -h, --help show this help message and exit --a A first number --b B second number
從 usage 可以看出 demo.py 接收兩個(gè)必選項(xiàng):--a 和 --b(帶有 [] 的為可選項(xiàng),沒(méi)帶的為必選項(xiàng)),它們分別代表第一個(gè)數(shù)和第二個(gè)數(shù),其中 A 和 B 分別代表實(shí)際傳入的參數(shù)。
在命令行中執(zhí)行
python3 demo.py --a 12 --b 19
返回結(jié)果是 31,這說(shuō)明我們通過(guò)命令行完成了求解兩數(shù)之和這個(gè)操作。
二、ArgumentParser
使用 argparse 的第一步是先創(chuàng)建一個(gè) ArgumentParser 對(duì)象,該對(duì)象包含將命令行解析成 Python 數(shù)據(jù)類型所需的全部信息,其常用參數(shù)如下
argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None)
2.1 prog
prog 默認(rèn)值為 os.path.basename(sys.argv[0]),也就是程序所在文件的名稱。
例如在第一章節(jié)中,我們?cè)趧?chuàng)建 ArgumentParser 對(duì)象時(shí)沒(méi)有指定 prog,因此采用了默認(rèn)值 demo.py。
先來(lái)看一個(gè)例子
parser = argparse.ArgumentParser() parser.print_help() # 和在命令行調(diào)用 python3 demo.py -h 的效果一樣(會(huì)有一些細(xì)微差別)
輸出的幫助信息:
usage: demo.py [-h] options: -h, --help show this help message and exit
可以看到若不指定 prog,則幫助信息將顯示 demo.py 作為程序名稱?,F(xiàn)在指定 prog
parser = argparse.ArgumentParser(prog="My Program")
相應(yīng)的幫助信息:
usage: My Program [-h] options: -h, --help show this help message and exit
可以看到原先 demo.py 的地方變成了 My Program。
2.2 usage
默認(rèn)情況下,ArgumentParser 根據(jù)它包含的選項(xiàng)來(lái)構(gòu)建用法消息。
這里依然使用第一章節(jié)的例子:
usage: demo.py [-h] --a A --b B options: -h, --help show this help message and exit --a A first number --b B second number
因?yàn)槲覀儧](méi)有指定 usage,所以 ArgumentParser 將使用它包含的三個(gè)選項(xiàng):-h、--a、--b 來(lái)構(gòu)建用法消息 usage,它位于幫助信息的第一行。
如果覺(jué)得默認(rèn)的 usage 有些冗余(因?yàn)橄路降?options 已經(jīng)詳細(xì)介紹了各個(gè)選項(xiàng)),我們可以自定義 usage
parser = argparse.ArgumentParser(usage="See the options below for usage")
相應(yīng)的幫助信息變成
usage: See the options below for usage options: -h, --help show this help message and exit --a A first number --b B second number
需要注意的是,在指定了 usage 后,prog 將會(huì)被覆蓋,即使在 ArgumentParser 中指定了 prog 也沒(méi)有用。
2.3 description
description 參數(shù)用來(lái)簡(jiǎn)要描述這個(gè)程序做什么以及怎么做。不指定 description 時(shí),幫助信息中將不予顯示。
依然使用第一章節(jié)的例子,這里我們指定 description
parser = argparse.ArgumentParser(description="This is my program.")
相應(yīng)的幫助信息
usage: demo.py [-h] --a A --b B This is my program. options: -h, --help show this help message and exit --a A first number --b B second number
可以看到 usage 和 options 中間多了一行內(nèi)容,這就是我們指定的 description。
2.4 epilog
該參數(shù)和 description 類似,區(qū)別在于,description 放在了 options 之前,而 epilog 放在了 options 之后。
依然使用第一章節(jié)的例子,這里我們同時(shí)指定 description 和 epilog
parser = argparse.ArgumentParser(description="This is my program.", epilog="The end.")
相應(yīng)的幫助信息
usage: demo.py [-h] --a A --b B This is my program. options: -h, --help show this help message and exit --a A first number --b B second number The end.
通常來(lái)講,以上四個(gè)參數(shù)中用的最多的是
prog
三、add_argument
add_argument() 方法用于向解析器中添加一個(gè)選項(xiàng)(位置參數(shù))。
ArgumentParser.add_argument( name or flags..., nargs, default, type, choices, required, help )
以上僅列出了 add_argument() 方法中最常用的幾個(gè)參數(shù)。
3.1 name or flags
name or flags 為選項(xiàng)(options)或位置參數(shù)(positional arguments)。
如果是選項(xiàng)的話可以傳入一系列flags(例如自帶的幫助就有兩個(gè):-h、--help),如果是位置參數(shù)的話則只能傳入一個(gè) name。
例如
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--install')
args = parser.parse_args()相應(yīng)的幫助信息:
usage: demo.py [-h] [-i INSTALL] options: -h, --help show this help message and exit -i INSTALL, --install INSTALL
這意味著我們?cè)诿钚姓{(diào)用 python3 demo.py -i INSTALL 和 python3 demo.py --install INSTALL 是等價(jià)的。
與選項(xiàng)不同的是,位置參數(shù)前不能加 -,并且每次只能傳入一個(gè),例如
parser = argparse.ArgumentParser()
parser.add_argument('param1')
parser.add_argument('param2')
args = parser.parse_args()相應(yīng)的幫助信息:
usage: demo.py [-h] param1 param2 positional arguments: integer options: -h, --help show this help message and exit
從 usage 可以看出位置參數(shù)在調(diào)用命令行時(shí)是必須傳入的。
以上是先添加位置參數(shù) param1 再添加 param2 的,如果我們調(diào)換順序,則幫助信息中的兩個(gè)參數(shù)的位置也將調(diào)換,這也詮釋了 “位置” 的含義。
可以看出,選項(xiàng)和位置參數(shù),前者相當(dāng)于關(guān)鍵字傳參,后者相當(dāng)于位置傳參。
3.2 type & default
顧名思義,type 指選項(xiàng)或位置參數(shù)將要被轉(zhuǎn)換成的數(shù)據(jù)類型(在命令行中傳入的參數(shù)都默認(rèn)以 str 類型存在)。
例如
parser = argparse.ArgumentParser()
parser.add_argument('--a')
parser.add_argument('--b', type=int)
args = parser.parse_args()
print(type(args.a), type(args.b))執(zhí)行 python3 demo.py --a 3 --b 3 后得到結(jié)果
<class 'str'> <class 'int'>
default 指選項(xiàng)或位置參數(shù)的默認(rèn)值,例如
parser = argparse.ArgumentParser()
parser.add_argument('--a', type=int, default=5)
args = parser.parse_args()
print(args.a)直接執(zhí)行 python3 demo.py 將會(huì)輸出 5,因?yàn)椴捎昧四J(rèn)值。
如果執(zhí)行 python3 demo.py --a x 則會(huì)輸出 x(x 是任何整數(shù),且不能省略)。
如果沒(méi)有為
--a指定默認(rèn)值,且在命令行執(zhí)行時(shí)也沒(méi)有向--a傳參,則args.a為None。
3.3 required & help
因?yàn)槲恢脜?shù)在命令行中是必須傳入的,所以 required 只能用于選項(xiàng)。
required 設(shè)為 True 則代表此選項(xiàng)為必選項(xiàng),否則為可選項(xiàng),默認(rèn)為 False。
例如
parser = argparse.ArgumentParser()
parser.add_argument('--a')
args = parser.parse_args()此時(shí)幫助信息為
usage: demo.py [-h] [--a A] options: -h, --help show this help message and exit --a A
usage 一行中 --a A 被一對(duì)方括號(hào) [] 括了起來(lái),說(shuō)明 --a 是可選項(xiàng)?,F(xiàn)在指定 required=True
parser.add_argument('--a', required=True)這時(shí)候幫助信息變?yōu)?/p>
usage: demo.py [-h] --a A options: -h, --help show this help message and exit --a A
可以看到 [] 消失了,說(shuō)明 --a 變成了必選項(xiàng)。
help 用來(lái)描述一個(gè)選項(xiàng)或位置參數(shù),該描述將會(huì)顯示在幫助信息中
parser = argparse.ArgumentParser()
parser.add_argument('--lr', type=float, default=1e-3, help="learning rate")
args = parser.parse_args()相應(yīng)的幫助信息
usage: demo.py [-h] [--lr LR] options: -h, --help show this help message and exit --lr LR learning rate
3.4 nargs & choices
假如選項(xiàng) --a 需要接收5個(gè)參數(shù),此時(shí)需要用 nargs 來(lái)指定
parser = argparse.ArgumentParser()
parser.add_argument('--a', type=int, nargs=5)
args = parser.parse_args()
print(args.a)執(zhí)行 python3 demo.py --a 1 2 3 4 5
可以得到
[1, 2, 3, 4, 5]
需要注意,nargs=1 最終會(huì)得到一個(gè)只含一個(gè)元素的列表,而非元素本身。
更進(jìn)一步,nargs='?' 代表傳入?yún)?shù)的數(shù)量為0個(gè)或1個(gè),nargs='+' 代表傳入?yún)?shù)的數(shù)量至少1個(gè),nargs='*' 代表可傳入任意多的參數(shù)。
有些時(shí)候,選項(xiàng) --a 的取值只能是固定的幾種,例如 --a 只能從整數(shù)1,3,5中選取,這時(shí)候需要用 choices 來(lái)指定一個(gè)列表
parser = argparse.ArgumentParser()
parser.add_argument('--a', type=int, choices=[1, 3, 5])
args = parser.parse_args()相應(yīng)的幫助信息
usage: demo.py [-h] [--a {1,3,5}]
options:
-h, --help show this help message and exit
--a {1,3,5}如果 --a 后面跟的數(shù)字不是1,3,5中的一個(gè)就會(huì)報(bào)錯(cuò)。
四、parse_args
我們先來(lái)看一個(gè)例子。
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument('--a', type=int)
parser.add_argument('--b', type=int)
print(sys.argv)在命令行執(zhí)行 python3 demo.py --a 3 --b 5 得到結(jié)果
['demo.py', '--a', '3', '--b', '5']
從中可以看出,sys.argv[0] 是文件名,sys.argv[1:] 是我們?cè)诿钚兄袀魅氲倪x項(xiàng)。
在之前的學(xué)習(xí)過(guò)程中,可能你已經(jīng)注意到了,每次我們?yōu)榻馕銎魈砑油晗鄳?yīng)的選項(xiàng)/位置參數(shù)后,都要執(zhí)行一遍 parser.parse_args()。
默認(rèn)情況下,parse_args() 采用 sys.argv[1:] 作為其參數(shù),并返回一個(gè)命名空間(類似于字典)。
舉個(gè)例子
parser = argparse.ArgumentParser()
parser.add_argument('--a', type=int, nargs=3)
parser.add_argument('--b', type=str)
parser.add_argument('--c', type=float)
args = parser.parse_args()
print(type(args))
print(args)執(zhí)行 python3 demo.py --a 1 3 5 --b 'k' --c 3.14 得到
<class 'argparse.Namespace'>
Namespace(a=[1, 3, 5], b='k', c=3.14)
如果只執(zhí)行 python3 demo.py --a 1 3 5 --b 'k',則得到
<class 'argparse.Namespace'>
Namespace(a=[1, 3, 5], b='k', c=None)
可以看出,如果在命令行中沒(méi)有提供相應(yīng)的選項(xiàng),并且該選項(xiàng)也沒(méi)有默認(rèn)值,則在命名空間中該選項(xiàng)的值為 None,這一點(diǎn)我們?cè)缭?3.2 節(jié)中就已經(jīng)提到了。
parser.parse_args() 返回的是一個(gè)命名空間對(duì)象,我們通常用 args 來(lái)存儲(chǔ)。
要訪問(wèn) args 中鍵 k 對(duì)應(yīng)的值 v,只需要 args.k 即可。
五、避免報(bào)錯(cuò)
在執(zhí)行 args = parser.parse_args() 這一步中,可能會(huì)出現(xiàn)報(bào)錯(cuò)情況,例如
parser = argparse.ArgumentParser()
parser.add_argument('--a', type=int)
args = parser.parse_args()如果我們?cè)诿钚袌?zhí)行 python3 demo.py --a 'abc' 就會(huì)報(bào)錯(cuò),這是因?yàn)樽址疅o(wú)法轉(zhuǎn)換成整數(shù)。
usage: demo.py [-h] [--a A] demo.py: error: argument --a: invalid int value: 'abc'
一般我們會(huì)采用如下代碼塊來(lái)避免直接看到不友好的報(bào)錯(cuò)
try:
args = parser.parse_args()
except:
parser.print_help()
sys.exit(0)六、使用shell腳本進(jìn)行調(diào)參
深度學(xué)習(xí)經(jīng)常需要調(diào)參,如果直接使用IDE打開(kāi) .py 文件去調(diào)未免顯得有些笨拙,而且也會(huì)變得不好維護(hù)。
如果使用 argparse,雖然不用每次修改 .py 文件,但在命令行里反復(fù)修改也略顯麻煩,這時(shí)候就需要將其與shell腳本進(jìn)行結(jié)合了。
為簡(jiǎn)便起見(jiàn),假設(shè)我們的項(xiàng)目架構(gòu)如下:
myproject
├── __init__.py
├── model
│ ├── model1.py
│ ├── model2.py
│ └── model3.py
├── scripts
│ └── train.sh
├── train.py
└── utils
├── utils1.py
└── utils2.py
其中 train.py 中的內(nèi)容為
import argparse
import sys
# 導(dǎo)入其他的包...
# 假設(shè)只有兩個(gè)超參數(shù)需要調(diào)
parser = argparse.ArgumentParser()
parser.add_argument('--bs', type=int, default=128, help="batch size")
parser.add_argument('--lr', type=float, default=0.001, help="learning rate")
try:
args = parser.parse_args()
except:
parser.print_help()
sys.exit(0)
# 超參數(shù)設(shè)置
BATCH_SIZE = args.bs
LEARNING_RATE = args.lr
# 其他代碼...這時(shí)候我們只需要在腳本目錄 scripts 下新建一個(gè)文件 train.sh,向其中寫入內(nèi)容
# 用來(lái)確保無(wú)論在哪里執(zhí)行該腳本,都能夠正確返回該腳本所在的目錄,以便后續(xù)根據(jù)這個(gè)目錄來(lái)定位所要運(yùn)行程序的相對(duì)位置 cd "$(dirname $0)" python3 ../train.py \ --bs 256 \ --lr 0.005 \
然后在命令行執(zhí)行(假設(shè)當(dāng)前處于 myproject 目錄下)
cd scripts && bash train.sh
即可開(kāi)始訓(xùn)練。后續(xù)如果需要調(diào)參,修改 train.sh 里的數(shù)字即可。
到此這篇關(guān)于Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解的文章就介紹到這了,更多相關(guān)Python的argparse模塊內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Python命令行參數(shù)解析包argparse的使用詳解
- Python中最好用的命令行參數(shù)解析工具(argparse)
- Python如何使用argparse模塊處理命令行參數(shù)
- python argparse命令行參數(shù)解析(推薦)
- python 如何利用argparse解析命令行參數(shù)
- Python argparse模塊實(shí)現(xiàn)解析命令行參數(shù)方法詳解
- python命令行參數(shù)argparse模塊基本用法詳解
- 詳解Python中命令行參數(shù)argparse的常用命令
- Python詳解argparse參數(shù)模塊之命令行參數(shù)
- 從零開(kāi)始用Python解析命令行參數(shù)之標(biāo)準(zhǔn)庫(kù)argparse和第三方庫(kù)click
相關(guān)文章
Python獲取圖像中像素點(diǎn)坐標(biāo)實(shí)例代碼
當(dāng)我們處理圖像的時(shí)候避免不了要對(duì)訪問(wèn),或是讀取某一個(gè)像素點(diǎn)的值,下面這篇文章主要給大家介紹了關(guān)于利用Python如何獲取圖像中像素點(diǎn)坐標(biāo)的相關(guān)資料,需要的朋友可以參考下2022-06-06
pycharm中:OSError:[WinError?1455]頁(yè)面文件太小無(wú)法完成操作問(wèn)題的多種解決方法
這篇文章主要給大家介紹了關(guān)于pycharm中:OSError:[WinError?1455]頁(yè)面文件太小無(wú)法完成操作問(wèn)題的多種徹底解決方法,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-02-02
Python *args和**kwargs用法實(shí)例解析
這篇文章主要介紹了Python *args和**kwargs用法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
Python爬取數(shù)據(jù)并寫入MySQL數(shù)據(jù)庫(kù)的實(shí)例
今天小編就為大家分享一篇Python爬取數(shù)據(jù)并寫入MySQL數(shù)據(jù)庫(kù)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
Python通過(guò)串口實(shí)現(xiàn)收發(fā)文件
這篇文章主要為大家詳細(xì)介紹了Python如何通過(guò)串口實(shí)現(xiàn)收發(fā)文件功能,文中的示例代碼簡(jiǎn)潔易懂,具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11
淺談pytorch池化maxpool2D注意事項(xiàng)
今天小編就為大家分享一篇淺談pytorch池化maxpool2D注意事項(xiàng),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02
python實(shí)現(xiàn)簡(jiǎn)單五子棋游戲
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡(jiǎn)單五子棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-06-06

