日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

命令行傳遞參數argparse.ArgumentParser的使用解析_python

作者:Puppy_L ? 更新時間: 2023-05-20 編程語言

當我們執行某個Python代碼,例如文件mycode.py時,想要傳遞一些可以隨時改變的自定義的參數。

比如在訓練神經網絡的時候,我們為了方便修改訓練的batch大小,epoch的大小等等,往往不想去動代碼。

此時最方便的方法就是在執行代碼的時候從命令行傳入參數。

argparse.ArgumentParser()可以很好地滿足這一需求。

1.簡單示例???

先看一段簡單的代碼,在名為mycode.py的文件中

import argparse
?
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
args = parser.parse_args()
print(args.square**2)

改代碼首先創建一個ArgumentParser對象,而添加為了參數square,則采用方法parser.add_argument。

每添加一個參數,就需要調用一次該方法。

args = parser.parse_args()則是使得改代碼生效。

執行這段代碼時,我們在命令行輸入

$ python mycode.py 9

可以得到輸出結果是9的平方,即81。

當然,添加多個參數時,執行的時候順序輸入這些參數。

例如mycode.py中是如下代碼:

import argparse
?
parser = argparse.ArgumentParser()
parser.add_argument("square", help="display a square of a given number", type=int)
parser.add_argument("number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)

我們在命令行輸入

$ python mycode.py 20 999

可以得到輸出結果是

400
999

2.argparse.ArgumentParser():創建對象

argparse.ArgumentParser()可設置的參數挺多,這里只提一下description這一個參數,他是一個自定義文本參數,可以用來描述這個程序是做什么的,也可以隨便寫點東西,總之,不影響程序的功能,可以看做是個注釋。

例如執行下一段代碼

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument("square", help="display a square of a given number", type=int)
parser.add_argument("number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)
parser.print_help()

其中parser.print_help()的功能是我們創建的parser的相關信息。

命令行輸入

$ python mycode.py 20 999

輸出結果為

400
999
usage: day1.py [-h] square number

PyTorch MNIST pruning from deep compression paper

positional arguments:
? square ? ? ?display a square of a given number
? number ? ? ?display a given number

optional arguments:
? -h, --help ?show this help message and exit

可以看到,description中的文字也得到了輸出。

3.parser.add_argument():添加參數

parser.add_argument()可配置的參數比較多,第一個是name,也就是名稱。

前面的例子中,我們用了

parser.add_argument("square", help="display a square of a given number", type=int)

其中"square"就是傳遞給name的參數(也可以單引號的’square’)。

這里還有個help參數,他和argparse.ArgumentParser()中的description類似,沒有實際作用,起到一個注釋的作用,會在parser.print_help()后打印出來。

而顯然type參數指定了輸入參數的類型,int是整數,float是浮點,str是字符串。

回到name參數,他除了可以直接用上面的square字符串,也可以一個橫杠加字符串以及兩個橫杠加字符串,例如’-sqaure’和’–square’。

常見的是兩個橫杠的寫法。下面來說說我個人發現的區別。

沒有橫杠的寫法,如我們前面所示,在命令行傳入參數的時候,不需要重寫名字,直接輸入參數:

$ python mycode.py 20 999

但是假如使用兩個橫杠的name,直接傳入參數會報錯,需要在傳入參數的時候重寫name。

例如下列代碼

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument("--square", help="display a square of a given number", type=int)
parser.add_argument("--number", help="display a given number", type=int)
args = parser.parse_args()
print(args.square**2)
print(args.number)

命令行執行時需要

$ python mycode.py --square 20 --number 999

另外一個需要提到的點是name的取名時,字符串中的橫杠和下劃線似乎是等價的。

例如

parser.add_argument('--batch_size', type=int, default=50)

parser.add_argument('--batch-size', type=int, default=50)

是等價的。但是傳遞參數的時候,name是橫杠也得用橫杠;name是下劃線也得用下劃線:

parser.add_argument('--batch_size', type=int, default=50)

$ python mycode.py --batch_size 128

或者

parser.add_argument('--batch-size', type=int, default=50)

$ python mycode.py --batch-size 128

調用的時候統一用下劃線:

print(args.batch_size)

個人建議傳遞name的時候還是用下劃線別用橫杠,方便查找。

這里default用于定義沒有傳遞參數時,該參數的默認值。

需要注意的是,name參數用橫杠的名稱的時候設置default值,命令行執行程序的時候可以不傳入參數或者傳入部分參數,沒傳入的參數使用默認值;name參數用沒有橫杠的名稱的時候,必須傳入參數。

下面的parser.add_argument()用到了action參數:

parser.add_argument('--no-cuda', action='store_true',help='disables CUDA training')

action='store_true’表示如果我們在命令行配置這個參數,則該參數為True;不配置則默認為False。

類似的action='store_false’表示如果我們在命令行配置這個參數,則該參數為False;不配置則默認為True。

配置action類型的參數不需要傳入具體的數值或者字符串,例如上例中,只需要

$ python mycode.py ----no-cuda

則表示對該參數進行了配置,他會被設為True。

metavar參數只對用parser.print_help()打印參數信息的時候會有影響,并不影響程序的其他功能。

例如

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument('--batch_size', type=int, default=50,?
? ? ? ? ? ? ? ? ? ? help='input batch size for training (default: 50)')
args = parser.parse_args()
parser.print_help()

打印結果為

usage: day1.py [-h] [--batch_size BATCH_SIZE]

PyTorch MNIST pruning from deep compression paper

optional arguments:
? -h, --help ? ? ? ? ? ?show this help message and exit
? --batch_size BATCH_SIZE
? ? ? ? ? ? ? ? ? ? ? ? input batch size for training (default: 50)

假如設置metavar參數:

parser = argparse.ArgumentParser(description='PyTorch MNIST pruning from deep compression paper')
parser.add_argument('--batch_size', type=int, default=50, metavar='N',
? ? ? ? ? ? ? ? ? ? help='input batch size for training (default: 50)')
args = parser.parse_args()
parser.print_help()

打印結果為

usage: day1.py [-h] [--batch_size N]

PyTorch MNIST pruning from deep compression paper

optional arguments:
? -h, --help ? ? ?show this help message and exit
? --batch_size N ?input batch size for training (default: 50)

可見,只是改變了一些參數的顯示。

為傳遞多個參數,可以用nagrs。當nargs為1時,有且只能傳入一個參數:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--one', nargs=1, required=True)
args = parser.parse_args()
print(args.one)

輸出

$ python mycode.py --one ?1
$ ['1']

當nargs為其他數值,例如3時,表示必須傳入3個參數:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--three', nargs=3, required=True)
args = parser.parse_args()
print(args.three)

輸出

$ python mycode.py --three ?1 2 3
$ ['1', '2', '3']

當設置了nargs參數,則輸出是一個list。

dest參數可以改變argparse.ArgumentParser()對應的參數調用時候的名稱。

例如下面這一段

import argparse

parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('integers', metavar='N', type=int, nargs='+',
? ? ? ? ? ? ? ? ? ? help='an integer for the accumulator')
parser.add_argument('--sum', dest='accumulate', action='store_const',
? ? ? ? ? ? ? ? ? ? const=sum, default=max,
? ? ? ? ? ? ? ? ? ? help='sum the integers (default: find the max)')

args = parser.parse_args()
print(args.accumulate(args.integers))

如果第二個參數沒有dest=‘accumulate’,則在調用的時候,最后一行代碼只能是

print(args.sum(args.integers))

dest使得它在調用的時候被改名。但要注意在命令行傳入參數的時候仍然是用name的字符串,即–sum。

總結

原文鏈接:https://blog.csdn.net/qq_36665989/article/details/120476651

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新