欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解

 更新時(shí)間:2023年08月03日 11:18:04   作者:Iareges  
這篇文章主要介紹了Python命令行參數(shù)解析之a(chǎn)rgparse模塊詳解,argparse?是?Python?的一個(gè)標(biāo)準(zhǔn)庫(kù),用于命令行參數(shù)的解析,這意味著我們無(wú)需在代碼中手動(dòng)為變量賦值,而是可以直接在命令行中向程序傳遞相應(yīng)的參數(shù),再由變量去讀取這些參數(shù),需要的朋友可以參考下

一、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ù),其中 AB 分別代表實(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

可以看到 usageoptions 中間多了一行內(nèi)容,這就是我們指定的 description。

2.4 epilog

該參數(shù)和 description 類似,區(qū)別在于,description 放在了 options 之前,而 epilog 放在了 options 之后。

依然使用第一章節(jié)的例子,這里我們同時(shí)指定 descriptionepilog

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 INSTALLpython3 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ì)輸出 xx 是任何整數(shù),且不能省略)。

如果沒有為 --a 指定默認(rèn)值,且在命令行執(zhí)行時(shí)也沒有向 --a 傳參,則 args.aNone

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)文章

  • 淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋

    淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋

    這篇文章主要介紹了淺談pytorch中torch.max和F.softmax函數(shù)的維度解釋,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-06-06
  • Python3將數(shù)據(jù)保存為txt文件的方法

    Python3將數(shù)據(jù)保存為txt文件的方法

    這篇文章主要介紹了Python3將數(shù)據(jù)保存為txt文件的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解如何使用Pandas處理時(shí)間序列數(shù)據(jù)

    詳解如何使用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-01
  • python的自變量選擇(所有子集回歸,后退法,逐步回歸)

    python的自變量選擇(所有子集回歸,后退法,逐步回歸)

    這篇文章主要介紹了python的自變量選擇(所有子集回歸,后退法,逐步回歸),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-06-06
  • linux中如何使用python3獲取ip地址

    linux中如何使用python3獲取ip地址

    這篇文章主要介紹了linux中如何使用python3獲取ip地址,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • Django學(xué)習(xí)之路之請(qǐng)求與響應(yīng)

    Django學(xué)習(xí)之路之請(qǐng)求與響應(yīng)

    這篇文章主要為大家詳細(xì)介紹了Django的請(qǐng)求與響應(yīng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • python求平均值多種方法代碼示例

    python求平均值多種方法代碼示例

    要求一個(gè)列表中的數(shù)的平均值,我們可以使用Python來(lái)實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于python求平均值多種方法的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • 使用Python爬取網(wǎng)頁(yè)中隱藏的div內(nèi)容

    使用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í)例

    今天小編就為大家分享一篇在Python中pandas.DataFrame重置索引名稱的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2018-11-11
  • Python類的繼承用法示例

    Python類的繼承用法示例

    這篇文章主要介紹了Python類的繼承用法,結(jié)合實(shí)例形式分析了Python類的定義、繼承等相關(guān)操作技巧,需要的朋友可以參考下
    2019-01-01

最新評(píng)論