【Python】Python中好用的命令行参数解析模块
大家好,我是小喵!
關注和星標『AI算法小喵』,和小喵一起學習AI算法!
?👆點擊關注|設為星標|干貨速遞👆
當你想要在終端窗口(ubuntu的終端窗口或windows的命令行窗口)來向程序傳入參數并讓程序運行時,就需要用到命令行參數解析模塊。Python本身提供了三個命令行參數解析模塊:getopt、optparse、argparse,三者之中argparse相對更好用。
argparse是python內置的一個用于命令項選項與參數解析的標準模塊,不需要安裝,上手也容易,本文將通過示例代碼介紹argparse的相關用法。
1.argparse四步使用法
argparse的使用可以概括為4步使用法:
導入模塊
創建解析器
添加參數
解析參數
2.argparse使用示例
上面已經給出了一個完整的使用示例圖,接下來將逐個講解。(😊這菜上得有點快,我們慢慢吃慢慢消化)
2.0 ?參數類型與默認值
參數支持各種類型,比如字符串、數值、布爾變量(boolean)等。在添加參數時可以通過type參數指定參數的類型,有效約束命令行中的參數。
另外通過default參數可以指定默認值,如果命令行中未給出參數,則參數取值為默認值。
parser.add_argument("--trainData",?type=str,?default="data/train.json") parser.add_argument("--validData",?type=str,?default="data/dev.json") parser.add_argument("--num_epochs",?type=int,?default=20) parser.add_argument("--batch_size",?type=int,?default=32) parser.add_argument("--lr",?type=float,?default=5e-5) parser.add_argument("--freeze_bert",type=bool,?default=True)假設我們只添加了上面這幾個參數,接著我們執行下面的語句進行幾組測試并查看測試結果。可以看到argparse模塊對傳入的參數進行了校驗,類型不符合時會直接拋出錯誤。當然這里面也涉及到了自動轉換參數類型,轉換后滿足類型約束的也可以正常運行。
默認值
修改參數值
2.1 關于布爾(boolean)類型的參數
單獨將布爾類型參數抽離出來講,是因為argparse在處理布爾類型參數時不能自動轉換參數類型。
下面的測試說明無論在命令行中給參數freeze_bert傳入什么值,它的值總是為默認值(這里因為解析的參數是作為對象屬性存在的,所以可使用print(f"freeze_bert:{args.freeze_bert}")僅看freeze_bert參數的值)。
#?python3?train.py?--freeze_bert?1???? freeze_bert:True #?python3?train.py?--freeze_bert?0 freeze_bert:True#?python3?train.py?--freeze_bert?False freeze_bert:True #?python3?train.py?--freeze_bert?True? freeze_bert:True那么想要命令行接收一個能夠返回boolean類型值的參數就不可能了嗎?
當然不是。本文先例舉一個簡單的可選方案:使用action參數,對取值為True/False類型的參數,在add_argument方法中加入參數action="store_true"/"store_false"。
parser.add_argument("--trainData",?type=str,?default="data/train.json") parser.add_argument("--validData",?type=str,?default="data/dev.json") parser.add_argument("--num_epochs",?type=int,?default=20) parser.add_argument("--batch_size",?type=int,?default=32) parser.add_argument("--lr",?type=float,?default=5e-5) #?parser.add_argument("--freeze_bert",type=bool,?default=True) parser.add_argument("--freeze_bert",?default=False,?action="store_true",help="If?provided,?freeze?the?layers?of?bert")如果指定的參數出現,那么action="store_true"/"store_false"起作用,參數值相應地會被存儲為True/False。如果不出現,那么參數值為默認值。
#?python3?train.py??????????????????? freeze_bert:False #?python3?train.py?--freeze_bert????? freeze_bert:True2.2 參數種類
參數可分為可選參數和必需參數。
可選參數
除前文例子中雙下劃線指定外(如:“--freeze_bert”),還可以通過單下劃線指定可選參數(如:“-fb”)
parser.add_argument("--freeze_bert",?"-fb",default=False,?action="store_true",help="If?provided,?freeze?the?layers?of?bert")#?python3?train.py?????????????? freeze_bert:False#?python3?train.py?-fb?????????? freeze_bert:True必需參數
必需參數通過required參數指定。這里我們修改下參數log_dir的指定定方式并進行相關測試。測試結果可見,如果沒在命令行中給必需參數賦值,程序會報錯。
parser.add_argument("--log_dir",?type=str,?required=True)#?python3?train.py?--log_dir?logs/ {'trainData':?'data/train.json',?'validData':?'data/dev.json',?'num_epochs':?20,?'batch_size':?32,?'lr':?5e-05,?'freeze_bert':?False,?'emb_dropout':?True,?'dropout_rate':?0.5,?'num_layers':?1,?'hidden_units':?128,?'log_dir':?'logs/',?'model_path':?'checkpoints/'}#?python3?train.py???????????????? usage:?train.py?[-h]?[--trainData?TRAINDATA]?[--validData?VALIDDATA][--num_epochs?NUM_EPOCHS]?[--batch_size?BATCH_SIZE]?[--lr?LR][--freeze_bert]?[--emb_dropout]?[--dropout_rate?DROPOUT_RATE][--num_layers?NUM_LAYERS]?[--hidden_units?HIDDEN_UNITS]--log_dir?LOG_DIR?[--model_path?MODEL_PATH] train.py:?error:?the?following?arguments?are?required:?--log_dir2.3 可選值
除設定參數類型、修改參數值、要求參數為必需參數或可選參數外,我們還可以約束參數的可取值。這里choices參數可以將參數限制為給定列表。
我們增加一個參數,
parser.add_argument("--pretrained_path","-prep",?type=str,choices=["bert-base-chinese","bert-base-uncased","bert-large-uncased"])然后進行下面的測試:
#??python3?train.py?-prep?bert-base-chinese?--log_dir?logs/ {'trainData':?'data/train.json',?'validData':?'data/dev.json',?'num_epochs':?20,?'batch_size':?32,?'lr':?5e-05,?'freeze_bert':?False,?'emb_dropout':?True,?'dropout_rate':?0.5,?'num_layers':?1,?'hidden_units':?128,?'log_dir':?'logs/',?'model_path':?'checkpoints/',?'pretrained_path':?'bert-base-chinese'}#?python3?train.py?-prep?bert-base-cased?--log_dir?logs/ usage:?train.py?[-h]?[--trainData?TRAINDATA]?[--validData?VALIDDATA][--num_epochs?NUM_EPOCHS]?[--batch_size?BATCH_SIZE]?[--lr?LR][--freeze_bert]?[--emb_dropout]?[--dropout_rate?DROPOUT_RATE][--num_layers?NUM_LAYERS]?[--hidden_units?HIDDEN_UNITS]--log_dir?LOG_DIR?[--model_path?MODEL_PATH][--pretrained_path?{bert-base-chinese,bert-base-uncased,bert-large-uncased}] train.py:?error:?argument?--pretrained_path/-prep:?invalid?choice:?'bert-base-cased'?(choose?from?'bert-base-chinese',?'bert-base-uncased',?'bert-large-uncased')3.總結
argparse模塊還有其他一些使用示例,比如目標、互斥參數、追加操作等等,后續篇章我們再來介紹。
往期精彩回顧適合初學者入門人工智能的路線及資料下載(圖文+視頻)機器學習入門系列下載中國大學慕課《機器學習》(黃海廣主講)機器學習及深度學習筆記等資料打印《統計學習方法》的代碼復現專輯 AI基礎下載機器學習交流qq群955171419,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【Python】Python中好用的命令行参数解析模块的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【机器学习】小数据集怎么上分? 几行代码
- 下一篇: 【Python】如何用Python实现W