在深度學習中我們會常常在服務器中跑代碼,因此常常會使用到命令行來運行程序。如果直接在命令行中輸入python xxxx.py就會執行相應的python程序了,但是如果我們想要改變文件中某些固定參數的數值,我們還得修改.py文件中的具體參數數值然后再使用命令行執行,但是如果運行python程序可以像命令行的一些命令一樣,可以輸入可選參數(以Liunx系統為例,cd --help 將會出現cd這個命令的一些幫助和可選參數介紹)然后再根據可選參數運行.py文件是不是會更好呢。python中就有argparse模塊來實現這樣的功能。
對於argparse模塊的介紹主要是三個方面的介紹,ArgumentParser 對象,add_argument() 方法和parse_args() 方法,他們都具有官方文檔,詳細的信息可以點擊鏈接取訪問到。而本文的介紹主要是簡單版使用,有些高階使用大家可以參看官方文檔和其他的博文。
一、argparse模塊使用流程
1、創建解析器
import argparse
parser = argparse.ArgumentParser(description='Process some integers.')
以上代碼創建一個 ArgumentParser 對象(parser)。ArgumentParser 對象包含將命令行解析成 Python 數據類型所需的全部信息。
2、添加參數
parser.add_argument('integers', metavar='N', type=int, nargs='+', help='an integer for the accumulator')
以上代碼是在添加你要關注的命令行參數和選項,每一個add_argument方法對應一個你要關注的參數或選項,解釋信息“an integer for the accumulator”將會出現在幫助文檔中(python xxx.py --help在命令行中調用出文件的幫助文檔),以及命令行傳入參數的類型定義為int,其他參數在介add_argument()方法的時候再具體講解。
3、解析參數
在完成解析器的創建以及定義好需要接受的參數之后,我們就需要解析我們接收到的參數了。主要方式是通過 ArgumentParser.parse_args()方法得到一個argparse.Namespace對象,而這個對象中不同屬性值就是我們通過命令行傳去進去的參數具體數值。
下面寫一個小的例子來說明如何完成上面這一套的操作的。
首先創建一個test.py文件,內容是:
import argparse parser = argparse.ArgumentParser(description="這是在幫助文檔之前顯示的內容") # 第一步創建解析器 parser.add_argument('--name',default="circle_wang", help = "這個參數請輸入姓名") #第二步輸入我需要的在命令行中接受的參數 parser.add_argument('--age', default=0, help = "這個參數請輸入年齡") # 繼續添加我需要在命令行中接受的參數 args = parser.parse_args() # 第四步獲取解析參數的對象Namespace
# 以下的輸出時是為了讓大家更好的看到具體的返回結果 print('args的類型',type(args)) print('name參數解析的結果:',type(args.name), '值:',args.name) print('age參數解析的結果:',type(args.age), '值:', args.age)
接下來在命令行中執行程序
python test.py --age=25 --name=大帥哥 # 我們把age=25,name=帥哥傳入進程序
args的類型 <class 'argparse.Namespace'> name參數解析的結果: <class 'str'> 值: 大帥哥 age參數解析的結果: <class 'str'> 值: 25

可以看到,我們從命令行中獲取的參數都是以字符串的方式儲存在Namespace的對應屬性中。我們接下來繼續看看如果使用--help來查看幫助文檔會有那些效果。
python test.py --help
以上就是我的這個test.py文件的幫助文檔,大家對比着看看就可以很清楚的知道我之前代碼中那些部分對應着幫助文檔的那些部分。大家可以更改示例代碼,並在命令行中運行(注意不是調試運行)。
二、ArgumentParser 對象
class argparse.ArgumentParser(prog=None, usage=None, description=None, epilog=None, parents=[], formatter_class=argparse.HelpFormatter, prefix_chars='-', fromfile_prefix_chars=None, argument_default=None, conflict_handler='error', add_help=True, allow_abbrev=True)
ArgumentParser 對象實例化的時候可以輸入的參數很多,其實我們最常用的就是description參數,這個參數輸入的是字符串,會顯示在幫助文檔之前。對於其他的參數我平常比較少使用大家可以參看官方文檔。
參數說明:
- prog : 程序的名稱(默認:sys.argv[0]) usage - 描述程序用途的字符串(默認值:從添加到解析器的參數生成)
- description : 在參數幫助文檔之前顯示的文本(默認值:無)
- epilog :在參數幫助文檔之后顯示的文本(默認值:無)
- parents : 一個 ArgumentParser 對象的列表,它們的參數也應包含在內
- formatter_class : 用於自定義幫助文檔輸出格式的類
- prefix_chars:可選參數的前綴字符集合(默認值:’-’)
- fromfile_prefix_chars : 當需要從文件中讀取其他參數時,用於標識文件名的前綴字符集合(默認值:None)
- argument_default :參數的全局默認值(默認值: None)
- conflict_handler :解決沖突選項的策略(通常是不必要的)
- add_help :為解析器添加一個 -h/–help 選項(默認值: True)
- allow_abbrev : 如果縮寫是無歧義的,則允許縮寫長選項 (默認值:True)
三、add_argument() 方法介紹
我們得到解析器(ArgumentParser 對象)之后,我們告訴這個解析器我們需要獲取那些輸入,這些輸入需要滿足那些條件,比如必須是什么數據類型...每一個參數我們都需要根據這種方式來添加,例如我們之前例子中所顯示的那樣,我們需要獲取兩個參數,一個叫name,一個叫age,並且分別給予了他們默認值(如果不給定默認值,在輸入的時候缺少這個參數就會報錯)
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest])
參數說明:
- name or flags :一個命名或者一個選項字符串的列表,例如 foo 或 -f, --foo.
- action :當參數在命令行中出現時使用的動作基本類型。
- nargs : 命令行參數應當消耗的數目。具體使用的時候查看對應的中文官方文檔
- const :被一些 action 和 nargs 選擇所需求的常數。
- default : 當參數未在命令行中出現時使用的值。
- type : 命令行參數應當被轉換成的類型。
- choices : 可用的參數的容器。
- required : 此命令行選項是否可省略 (僅選項可用)。
- help : 一個此選項作用的簡單描述。
- metavar : 在使用方法消息中使用的參數值示例。
- dest : 被添加到 parse_args() 所返回對象上的屬性名。
其中最常用的可選參數是:default,type,help,nargs下面我就在之前的test.py的基礎上更改一些參數來說明其使用方法。
test.py文件為:
import argparse parser = argparse.ArgumentParser(description="這是在幫助文檔之前顯示的內容") parser.add_argument('name',default="circle_wang", help = "這個參數請輸入姓名") # 如果在定義參數名字的時候不添加‘-’則被認為是位置參數,這個參數的讀取會按順序來讀取
parser.add_argument('--age', default=0, help = "這個參數請輸入年齡",type=int) parser.add_argument('--parents', nargs=2, help = "請輸入父親和母親的名字,以空格分割") # 這里nages=N意味着--parents參數后面跟的N個輸入會被讀取,並整合為一個列表 parser.add_argument('--brothers', nargs='+', help = "請輸入兄弟的名字任意長度,以空格分割", default='大哥') # nages=‘+’意味着在--brothers參數后面跟的所有參數都將被整合成一個列表。 args = parser.parse_args() print('args的類型',type(args)) print('name參數解析的結果:',type(args.name), '值:',args.name) print('age參數解析的結果:',type(args.age), '值:',args.age) print('parents參數解析的結果:',type(args.parents), '值:',args.parents) print('brothers參數解析的結果:',type(args.brothers), '值:',args.brothers)
下面我們在命令行進行輸入試一試:
python test.py 我的名字 --age=12 --brothers 老大 老二 老三 --parents 爸爸 媽媽 # 注意這里的brothers和parents參數不能用=來連接,只能用空格來隔
四、parse_args() 方法介紹
其實這一段沒有什么好說的了,因為前面已經一直在使用了,只要注意的是所有的參數如果type沒有給定那么里面的屬性就是default時的屬性,否則就是str,要注意一些情況下的類型轉換。
本文參考網址:
https://blog.csdn.net/The_Time_Runner/article/details/97941409
https://blog.csdn.net/weixin_39533742/article/details/114910227
