背景
最近一直訓練模型,進行模型調參比較,但是隨著模型引數多起來了,想獲得不同引數模型結果也越來越麻煩。看看前輩以及github上開源專案的程式碼後,感覺這個感覺學到了很多。讓你的python程式輸入引數更像Linux那樣輸入,之前使用sys.argv,看到這個之後感覺太low了。這個就是 Python 標準庫的一部分:Argparse[1]。那麼下面讓我們看看他是多麼方便。
1 入門操作由於這個包是Python標準庫中的一部分,所以就不用安裝了,直接使用即可。下面結合文章argparse基本用法[2]和自己的理解書寫如下程式:
import argparsedef main(): parser = argparse.ArgumentParser(description="argparse使用-小試牛刀") parser.add_argument('-n', '--name', default="juzipi") parser.add_argument("-j", '--job', default="程式設計師") args = parser.parse_args() print(args) name = args.name job = args.job print("Hello, 大家好,我是 {} {}!".format(job, name))if __name__ == '__main__': main()
執行方式:linux系統使用比較多的還是命令,這裡我也在終端裡執行程式,如下是使用預設引數執行:
無引數執行
有參執行如下:
有參執行
看起來是不是挺有意思的。在上面的程式碼中,使用argparse.ArgumentParser構建一個引數解析器,其實也就是建立一個相關物件,description描述了這個解析器,在命令列中使用-h(--help)命令就可以看到,如下:
幫助文件
是不是很清晰。
使用這個引數解析器得有一些我們需要的引數,那麼就使用parser.add_argument()方法去定義一些。上面的例子就是增加了兩個引數:name, job。其中'-n'、'--name'都表示一個引數,而default是執行程式時不輸入對應引數值所啟用的值。現在相信你對這個有一定的瞭解了。下面我們再深入一下。
2.1 required:表示這個引數是否一定需要設定如果設定了required=True,則在實際執行的時候不設定該引數將報錯,在上面的程式上新增如下程式碼:
parser.add_argument('-ne', '--need', required=True)
當不輸入值時,則有:
必要引數
2.2 type: 引數型別命令引數是傳給其他功能模型使用,不同的功能模型則需要不同型別的資料輸入,可以透過設定type直接將輸入的資料轉換成對應型別的資料(前提輸入的資料格式就滿足轉換要求),修改need引數的程式碼如下:
parser.add_argument('-ne', '--need', required=True, type=int)
執行檢視:
指定引數型別
2.3 choices:引數值只能從幾個選項裡面選擇有時為了更加人性化提示使用者使用,可以提升使用者輸入哪些值,慢慢地感覺到了Linux的味道了。現在我們修改need引數的程式碼如下:
parser.add_argument('-ne', '--need', required=True, type=int, choices=[100, 200])
使用-h命令檢視修改後的樣子:
幫助命令
可以看到,need引數的選擇項。具體效果,朋友們可以自行試試,這裡不費篇幅展示了,以下是輸入選擇範圍外的結果。
選擇範圍外結果
2.4 dest:修改程式內部獲取值方法在命令列中輸入的命令是-ne等形式把引數傳入到程式,程式可透過其他屬性獲取對應引數值,就是dest,修改need引數如下:
parser.add_argument('-ne', '--need', required=True, type=int, choices=[100, 200], dest="need_real")
執行:
獲取真實值
上面還修改列印語句為:
print("need引數的型別:{},值為:{}".format(type(args.need_real), args.need_real))
3 總結
argparse是一個全面的引數處理庫,功能比較強大,內容也比較多,暫時就介紹這麼多吧。更多實際需要的功能,我們就根據需要檢視官方文件以及網上的其他資料吧。
參考資料[1] Argparse: https://docs.python.org/zh-cn/3.7/howto/argparse.html
[2] argparse基本用法: https://blog.csdn.net/yy_diego/article/details/82851661
[3] argparse簡要用法總結: http://vra.github.io/2017/12/02/argparse-usage/