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 作為程序名稱。現(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-06
Python3將數(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

