Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解
一、argparse是什么?
argparse
是 Python 的一個標準庫,用于命令行參數(shù)的解析,這意味著我們無需在代碼中手動為變量賦值
而是可以直接在命令行中向程序傳遞相應的參數(shù),再由變量去讀取這些參數(shù)。
如果沒有安裝 argparse
,可執(zhí)行如下命令進行安裝
pip install argparse
使用時只需導入
import argparse
1.1 一個例子
我們先來看一個最簡單的例子,了解了使用 argparse
的大致步驟后,再來詳細介紹各個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
可以看到相應的幫助信息
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
接收兩個必選項:--a
和 --b
(帶有 []
的為可選項,沒帶的為必選項),它們分別代表第一個數(shù)和第二個數(shù),其中 A
和 B
分別代表實際傳入的參數(shù)。
在命令行中執(zhí)行
python3 demo.py --a 12 --b 19
返回結果是 31
,這說明我們通過命令行完成了求解兩數(shù)之和這個操作。
二、ArgumentParser
使用 argparse
的第一步是先創(chuàng)建一個 ArgumentParser
對象,該對象包含將命令行解析成 Python 數(shù)據(jù)類型所需的全部信息,其常用參數(shù)如下
argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None)
2.1 prog
prog
默認值為 os.path.basename(sys.argv[0])
,也就是程序所在文件的名稱。
例如在第一章節(jié)中,我們在創(chuàng)建 ArgumentParser
對象時沒有指定 prog
,因此采用了默認值 demo.py
。
先來看一個例子
parser = argparse.ArgumentParser() parser.print_help() # 和在命令行調(diào)用 python3 demo.py -h 的效果一樣(會有一些細微差別)
輸出的幫助信息:
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")
相應的幫助信息:
usage: My Program [-h] options: -h, --help show this help message and exit
可以看到原先 demo.py
的地方變成了 My Program
。
2.2 usage
默認情況下,ArgumentParser
根據(jù)它包含的選項來構建用法消息。
這里依然使用第一章節(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
因為我們沒有指定 usage
,所以 ArgumentParser
將使用它包含的三個選項:-h
、--a
、--b
來構建用法消息 usage
,它位于幫助信息的第一行。
如果覺得默認的 usage
有些冗余(因為下方的 options
已經(jīng)詳細介紹了各個選項),我們可以自定義 usage
parser = argparse.ArgumentParser(usage="See the options below for usage")
相應的幫助信息變成
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
將會被覆蓋,即使在 ArgumentParser
中指定了 prog
也沒有用。
2.3 description
description
參數(shù)用來簡要描述這個程序做什么以及怎么做。不指定 description
時,幫助信息中將不予顯示。
依然使用第一章節(jié)的例子,這里我們指定 description
parser = argparse.ArgumentParser(description="This is my program.")
相應的幫助信息
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é)的例子,這里我們同時指定 description
和 epilog
parser = argparse.ArgumentParser(description="This is my program.", epilog="The end.")
相應的幫助信息
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.
通常來講,以上四個參數(shù)中用的最多的是
prog
三、add_argument
add_argument()
方法用于向解析器中添加一個選項(位置參數(shù))。
ArgumentParser.add_argument( name or flags..., nargs, default, type, choices, required, help )
以上僅列出了 add_argument()
方法中最常用的幾個參數(shù)。
3.1 name or flags
name or flags
為選項(options
)或位置參數(shù)(positional arguments
)。
如果是選項的話可以傳入一系列flags(例如自帶的幫助就有兩個:-h
、--help
),如果是位置參數(shù)的話則只能傳入一個 name
。
例如
parser = argparse.ArgumentParser() parser.add_argument('-i', '--install') args = parser.parse_args()
相應的幫助信息:
usage: demo.py [-h] [-i INSTALL] options: -h, --help show this help message and exit -i INSTALL, --install INSTALL
這意味著我們在命令行調(diào)用 python3 demo.py -i INSTALL
和 python3 demo.py --install INSTALL
是等價的。
與選項不同的是,位置參數(shù)前不能加 -
,并且每次只能傳入一個,例如
parser = argparse.ArgumentParser() parser.add_argument('param1') parser.add_argument('param2') args = parser.parse_args()
相應的幫助信息:
usage: demo.py [-h] param1 param2 positional arguments: integer options: -h, --help show this help message and exit
從 usage
可以看出位置參數(shù)在調(diào)用命令行時是必須傳入的。
以上是先添加位置參數(shù) param1
再添加 param2
的,如果我們調(diào)換順序,則幫助信息中的兩個參數(shù)的位置也將調(diào)換,這也詮釋了 “位置” 的含義。
可以看出,選項和位置參數(shù),前者相當于關鍵字傳參,后者相當于位置傳參。
3.2 type & default
顧名思義,type
指選項或位置參數(shù)將要被轉換成的數(shù)據(jù)類型(在命令行中傳入的參數(shù)都默認以 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
后得到結果
<class 'str'> <class 'int'>
default
指選項或位置參數(shù)的默認值,例如
parser = argparse.ArgumentParser() parser.add_argument('--a', type=int, default=5) args = parser.parse_args() print(args.a)
直接執(zhí)行 python3 demo.py
將會輸出 5
,因為采用了默認值。
如果執(zhí)行 python3 demo.py --a x
則會輸出 x
(x
是任何整數(shù),且不能省略)。
如果沒有為
--a
指定默認值,且在命令行執(zhí)行時也沒有向--a
傳參,則args.a
為None
。
3.3 required & help
因為位置參數(shù)在命令行中是必須傳入的,所以 required
只能用于選項。
required
設為 True
則代表此選項為必選項,否則為可選項,默認為 False
。
例如
parser = argparse.ArgumentParser() parser.add_argument('--a') args = parser.parse_args()
此時幫助信息為
usage: demo.py [-h] [--a A] options: -h, --help show this help message and exit --a A
usage
一行中 --a A
被一對方括號 []
括了起來,說明 --a
是可選項。現(xiàn)在指定 required=True
parser.add_argument('--a', required=True)
這時候幫助信息變?yōu)?/p>
usage: demo.py [-h] --a A options: -h, --help show this help message and exit --a A
可以看到 []
消失了,說明 --a
變成了必選項。
help
用來描述一個選項或位置參數(shù),該描述將會顯示在幫助信息中
parser = argparse.ArgumentParser() parser.add_argument('--lr', type=float, default=1e-3, help="learning rate") args = parser.parse_args()
相應的幫助信息
usage: demo.py [-h] [--lr LR] options: -h, --help show this help message and exit --lr LR learning rate
3.4 nargs & choices
假如選項 --a
需要接收5個參數(shù),此時需要用 nargs
來指定
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
最終會得到一個只含一個元素的列表,而非元素本身。
更進一步,nargs='?'
代表傳入?yún)?shù)的數(shù)量為0個或1個,nargs='+'
代表傳入?yún)?shù)的數(shù)量至少1個,nargs='*'
代表可傳入任意多的參數(shù)。
有些時候,選項 --a
的取值只能是固定的幾種,例如 --a
只能從整數(shù)1,3,5中選取,這時候需要用 choices
來指定一個列表
parser = argparse.ArgumentParser() parser.add_argument('--a', type=int, choices=[1, 3, 5]) args = parser.parse_args()
相應的幫助信息
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中的一個就會報錯。
四、parse_args
我們先來看一個例子。
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
得到結果
['demo.py', '--a', '3', '--b', '5']
從中可以看出,sys.argv[0]
是文件名,sys.argv[1:]
是我們在命令行中傳入的選項。
在之前的學習過程中,可能你已經(jīng)注意到了,每次我們?yōu)榻馕銎魈砑油晗鄳倪x項/位置參數(shù)后,都要執(zhí)行一遍 parser.parse_args()
。
默認情況下,parse_args()
采用 sys.argv[1:]
作為其參數(shù),并返回一個命名空間(類似于字典)。
舉個例子
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)
可以看出,如果在命令行中沒有提供相應的選項,并且該選項也沒有默認值,則在命名空間中該選項的值為 None
,這一點我們早在 3.2 節(jié)中就已經(jīng)提到了。
parser.parse_args()
返回的是一個命名空間對象,我們通常用 args
來存儲。
要訪問 args
中鍵 k
對應的值 v
,只需要 args.k
即可。
五、避免報錯
在執(zhí)行 args = parser.parse_args()
這一步中,可能會出現(xiàn)報錯情況,例如
parser = argparse.ArgumentParser() parser.add_argument('--a', type=int) args = parser.parse_args()
如果我們在命令行執(zhí)行 python3 demo.py --a 'abc'
就會報錯,這是因為字符串無法轉換成整數(shù)。
usage: demo.py [-h] [--a A] demo.py: error: argument --a: invalid int value: 'abc'
一般我們會采用如下代碼塊來避免直接看到不友好的報錯
try: args = parser.parse_args() except: parser.print_help() sys.exit(0)
六、使用shell腳本進行調(diào)參
深度學習經(jīng)常需要調(diào)參,如果直接使用IDE打開 .py
文件去調(diào)未免顯得有些笨拙,而且也會變得不好維護。
如果使用 argparse
,雖然不用每次修改 .py
文件,但在命令行里反復修改也略顯麻煩,這時候就需要將其與shell腳本進行結合了。
為簡便起見,假設我們的項目架構如下:
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 # 導入其他的包... # 假設只有兩個超參數(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ù)設置 BATCH_SIZE = args.bs LEARNING_RATE = args.lr # 其他代碼...
這時候我們只需要在腳本目錄 scripts
下新建一個文件 train.sh
,向其中寫入內(nèi)容
# 用來確保無論在哪里執(zhí)行該腳本,都能夠正確返回該腳本所在的目錄,以便后續(xù)根據(jù)這個目錄來定位所要運行程序的相對位置 cd "$(dirname $0)" python3 ../train.py \ --bs 256 \ --lr 0.005 \
然后在命令行執(zhí)行(假設當前處于 myproject
目錄下)
cd scripts && bash train.sh
即可開始訓練。后續(xù)如果需要調(diào)參,修改 train.sh
里的數(shù)字即可。
到此這篇關于Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解的文章就介紹到這了,更多相關Python的argparse模塊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋
這篇文章主要介紹了淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06Python3將數(shù)據(jù)保存為txt文件的方法
這篇文章主要介紹了Python3將數(shù)據(jù)保存為txt文件的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09使用Python爬取網(wǎng)頁中隱藏的div內(nèi)容
在這個信息爆炸的時代,互聯(lián)網(wǎng)上的數(shù)據(jù)無時無刻不在增長,許多網(wǎng)頁為了提升用戶體驗或保護數(shù)據(jù),會將部分內(nèi)容默認隱藏起來,只有在特定條件下才會顯示,所以本文將詳細介紹如何使用Python爬取這些隱藏的div內(nèi)容,需要的朋友可以參考下2025-03-03在Python中pandas.DataFrame重置索引名稱的實例
今天小編就為大家分享一篇在Python中pandas.DataFrame重置索引名稱的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11