Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解
一、argparse是什么?
argparse
是 Python 的一個(gè)標(biāo)準(zhǔn)庫(kù),用于命令行參數(shù)的解析,這意味著我們無(wú)需在代碼中手動(dòng)為變量賦值
而是可以直接在命令行中向程序傳遞相應(yīng)的參數(shù),再由變量去讀取這些參數(shù)。
如果沒有安裝 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),沒帶的為必選項(xiàng)),它們分別代表第一個(gè)數(shù)和第二個(gè)數(shù),其中 A
和 B
分別代表實(shí)際傳入的參數(shù)。
在命令行中執(zhí)行
python3 demo.py --a 12 --b 19
返回結(jié)果是 31
,這說明我們通過命令行完成了求解兩數(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í)沒有指定 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)槲覀儧]有指定 usage
,所以 ArgumentParser
將使用它包含的三個(gè)選項(xiàng):-h
、--a
、--b
來(lái)構(gòu)建用法消息 usage
,它位于幫助信息的第一行。
如果覺得默認(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
也沒有用。
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ù),且不能省略)。
如果沒有為
--a
指定默認(rèn)值,且在命令行執(zhí)行時(shí)也沒有向--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),說明 --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
可以看到 []
消失了,說明 --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í)過程中,可能你已經(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)
可以看出,如果在命令行中沒有提供相應(yīng)的選項(xiàng),并且該選項(xiàng)也沒有默認(rèn)值,則在命名空間中該選項(xiàng)的值為 None
,這一點(diǎn)我們?cè)缭?3.2 節(jié)中就已經(jīng)提到了。
parser.parse_args()
返回的是一個(gè)命名空間對(duì)象,我們通常用 args
來(lái)存儲(chǔ)。
要訪問 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打開 .py
文件去調(diào)未免顯得有些笨拙,而且也會(huì)變得不好維護(hù)。
如果使用 argparse
,雖然不用每次修改 .py
文件,但在命令行里反復(fù)修改也略顯麻煩,這時(shí)候就需要將其與shell腳本進(jìn)行結(jié)合了。
為簡(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
即可開始訓(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)文章希望大家以后多多支持腳本之家!
- 關(guān)于Python參數(shù)解析器argparse的應(yīng)用場(chǎng)景
- 詳解Python中的argparse模塊
- Python?內(nèi)置模塊?argparse快速入門教程
- 深入講解Python命令行解析模塊argparse
- python?argparse的使用步驟(全網(wǎng)最全)
- python中的argparse基本用法(使用步驟)
- python?命令行參數(shù)模塊argparse的實(shí)現(xiàn)
- Python中命令行參數(shù)argparse模塊的使用
- python命令行參數(shù)argparse模塊基本用法詳解
- Python中argparse基本用法小結(jié)
相關(guān)文章
淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋
這篇文章主要介紹了淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-06-06Python3將數(shù)據(jù)保存為txt文件的方法
這篇文章主要介紹了Python3將數(shù)據(jù)保存為txt文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-09-09詳解如何使用Pandas處理時(shí)間序列數(shù)據(jù)
時(shí)間序列數(shù)據(jù)在數(shù)據(jù)分析建模中很常見,例如天氣預(yù)報(bào),空氣狀態(tài)監(jiān)測(cè),股票交易等金融場(chǎng)景,本文給大家詳細(xì)介紹了如何使用Pandas處理時(shí)間序列數(shù)據(jù),文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下2024-01-01Django學(xué)習(xí)之路之請(qǐng)求與響應(yīng)
這篇文章主要為大家詳細(xì)介紹了Django的請(qǐng)求與響應(yīng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-02-02使用Python爬取網(wǎng)頁(yè)中隱藏的div內(nèi)容
在這個(gè)信息爆炸的時(shí)代,互聯(lián)網(wǎng)上的數(shù)據(jù)無(wú)時(shí)無(wú)刻不在增長(zhǎng),許多網(wǎng)頁(yè)為了提升用戶體驗(yàn)或保護(hù)數(shù)據(jù),會(huì)將部分內(nèi)容默認(rèn)隱藏起來(lái),只有在特定條件下才會(huì)顯示,所以本文將詳細(xì)介紹如何使用Python爬取這些隱藏的div內(nèi)容,需要的朋友可以參考下2025-03-03在Python中pandas.DataFrame重置索引名稱的實(shí)例
今天小編就為大家分享一篇在Python中pandas.DataFrame重置索引名稱的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-11-11