命令行傳遞參數(shù)argparse.ArgumentParser的使用解析
當我們執(zhí)行某個Python代碼,例如文件mycode.py時,想要傳遞一些可以隨時改變的自定義的參數(shù)。
比如在訓練神經(jīng)網(wǎng)絡的時候,我們?yōu)榱朔奖阈薷挠柧毜腷atch大小,epoch的大小等等,往往不想去動代碼。
此時最方便的方法就是在執(zhí)行代碼的時候從命令行傳入?yún)?shù)。
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)
改代碼首先創(chuàng)建一個ArgumentParser對象,而添加為了參數(shù)square,則采用方法parser.add_argument。
每添加一個參數(shù),就需要調用一次該方法。
args = parser.parse_args()則是使得改代碼生效。
執(zhí)行這段代碼時,我們在命令行輸入
$ python mycode.py 9
可以得到輸出結果是9的平方,即81。
當然,添加多個參數(shù)時,執(zhí)行的時候順序輸入這些參數(shù)。
例如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():創(chuàng)建對象
argparse.ArgumentParser()可設置的參數(shù)挺多,這里只提一下description這一個參數(shù),他是一個自定義文本參數(shù),可以用來描述這個程序是做什么的,也可以隨便寫點東西,總之,不影響程序的功能,可以看做是個注釋。
例如執(zhí)行下一段代碼
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()的功能是我們創(chuàng)建的parser的相關信息。
命令行輸入
$ python mycode.py 20 999
輸出結果為
400
999
usage: day1.py [-h] square numberPyTorch MNIST pruning from deep compression paper
positional arguments:
square display a square of a given number
number display a given numberoptional arguments:
-h, --help show this help message and exit
可以看到,description中的文字也得到了輸出。
3.parser.add_argument():添加參數(shù)
parser.add_argument()可配置的參數(shù)比較多,第一個是name,也就是名稱。
前面的例子中,我們用了
parser.add_argument("square", help="display a square of a given number", type=int)
其中"square"就是傳遞給name的參數(shù)(也可以單引號的’square’)。
這里還有個help參數(shù),他和argparse.ArgumentParser()中的description類似,沒有實際作用,起到一個注釋的作用,會在parser.print_help()后打印出來。
而顯然type參數(shù)指定了輸入?yún)?shù)的類型,int是整數(shù),float是浮點,str是字符串。
回到name參數(shù),他除了可以直接用上面的square字符串,也可以一個橫杠加字符串以及兩個橫杠加字符串,例如’-sqaure’和’–square’。
常見的是兩個橫杠的寫法。下面來說說我個人發(fā)現(xiàn)的區(qū)別。
沒有橫杠的寫法,如我們前面所示,在命令行傳入?yún)?shù)的時候,不需要重寫名字,直接輸入?yún)?shù):
$ python mycode.py 20 999
但是假如使用兩個橫杠的name,直接傳入?yún)?shù)會報錯,需要在傳入?yún)?shù)的時候重寫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)
命令行執(zhí)行時需要
$ 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)
是等價的。但是傳遞參數(shù)的時候,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
調用的時候統(tǒng)一用下劃線:
print(args.batch_size)
個人建議傳遞name的時候還是用下劃線別用橫杠,方便查找。
這里default用于定義沒有傳遞參數(shù)時,該參數(shù)的默認值。
需要注意的是,name參數(shù)用橫杠的名稱的時候設置default值,命令行執(zhí)行程序的時候可以不傳入?yún)?shù)或者傳入部分參數(shù),沒傳入的參數(shù)使用默認值;name參數(shù)用沒有橫杠的名稱的時候,必須傳入?yún)?shù)。
下面的parser.add_argument()用到了action參數(shù):
parser.add_argument('--no-cuda', action='store_true',help='disables CUDA training')
action='store_true’表示如果我們在命令行配置這個參數(shù),則該參數(shù)為True;不配置則默認為False。
類似的action='store_false’表示如果我們在命令行配置這個參數(shù),則該參數(shù)為False;不配置則默認為True。
配置action類型的參數(shù)不需要傳入具體的數(shù)值或者字符串,例如上例中,只需要
$ python mycode.py ----no-cuda
則表示對該參數(shù)進行了配置,他會被設為True。
metavar參數(shù)只對用parser.print_help()打印參數(shù)信息的時候會有影響,并不影響程序的其他功能。
例如
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參數(shù):
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)
可見,只是改變了一些參數(shù)的顯示。
為傳遞多個參數(shù),可以用nagrs。當nargs為1時,有且只能傳入一個參數(shù):
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為其他數(shù)值,例如3時,表示必須傳入3個參數(shù):
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參數(shù),則輸出是一個list。
dest參數(shù)可以改變argparse.ArgumentParser()對應的參數(shù)調用時候的名稱。
例如下面這一段
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))
如果第二個參數(shù)沒有dest=‘accumulate’,則在調用的時候,最后一行代碼只能是
print(args.sum(args.integers))
dest使得它在調用的時候被改名。但要注意在命令行傳入?yún)?shù)的時候仍然是用name的字符串,即–sum。
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
使用pyqt5 tablewidget 單元格設置正則表達式
今天小編就為大家分享一篇使用pyqt5 tablewidget 單元格設置正則表達式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12python xml.etree.ElementTree遍歷xml所有節(jié)點實例詳解
這篇文章主要介紹了python xml.etree.ElementTree遍歷xml所有節(jié)點實例詳解的相關資料,這里附有實例代碼,需要的朋友可以參考下2016-12-12python使用Tkinter顯示網(wǎng)絡圖片的方法
這篇文章主要介紹了python使用Tkinter顯示網(wǎng)絡圖片的方法,涉及Python操作圖片的相關技巧,需要的朋友可以參考下2015-04-04