argparse簡要用法總結
目錄
argparse 是python自帶的命令列引數解析包,可以用來方便地讀取命令列引數,當你的程式碼需要頻繁地修改引數的時候,使用這個工具可以將引數和程式碼分離開來,讓你的程式碼更簡潔,適用範圍更廣。
argparse使用比較簡單,常用的功能可能較快地實現出來,下面我分幾個步驟,以Python3為例,逐漸遞增地講述argparse的用法。
1. 基本框架
下面是使用argparser從命令列獲取使用者名稱,然後列印’Hello ‘+ 使用者名稱,假設python檔名為print_name.py
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# file-name:print_name.py import argparse def get_parser(): parser = argparse.ArgumentParser(description="Demo of argparse") parser.add_argument('--name', default='Great') return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() name = args.name print('Hello {}'.format(name)) |
在命令列執行如下命令:
1 2 |
$ python print_name.py --name Wang Hello Wang |
上面的程式碼段中,我們顯示引入了argparser
包,然後通過argparser.ArgumentParser
函式生成argparser物件,其中這個函式的description
函式表示在命令列顯示幫助資訊的時候,這個程式的描述資訊。之後我們通過物件的add_argument
函式來增加引數。這裡我們只增加了一個--name
的引數,然後後面的default
引數表示如果沒提供引數,我們預設採用的值。即如果像下面這樣執行命令:
1 |
$ python print_name.py |
則輸出是:
1 |
$ Hello Great |
最後我們通過argpaser物件的parser_args
函式來獲取所有引數args
,然後通過args.name
的方式得到我們設定的--name
引數的值,可以看到這裡argparse預設的引數名就是--name
形式裡面--
後面的字串。
整個流程就是這樣,下面我們詳細講解add_argument
函式的一些最常用的引數,使得你看完這個教程之後,能完成科研和工作中的大部分命令解析任務。
2. default
:沒有設定值情況下的預設引數
如同上例中展示的,default表示命令列沒有設定該引數的時候,程式中用什麼值來代替。
3. required
: 表示這個引數是否一定需要設定
如果設定了required=True
,則在實際執行的時候不設定該引數將報錯:
1 2 3 |
... parser.add_argument('-name', required=True) ... |
則執行下面的命令會報錯:
1 2 3 |
$ python print_name.py usage: print_name.py [-h] --name NAME print_name.py: error: argument --name is required |
4. type
:引數型別
預設的引數型別是str型別,如果你的程式需要一個整數或者布林型引數,你需要設定type=int
或type=bool
,下面是一個列印平方的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#name: square.py import argparse def get_parser(): parser = argparse.ArgumentParser( description='Calculate square of a given number') parser.add_argument('-number', type=int) return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() res = args.number ** 2 print('square of {} is {}'.format(args.number, res)) |
執行:
1 2 |
$ python square.py -number 5 square of 5 is 25 |
5. choices
:引數值只能從幾個選項裡面選擇
如下面的程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# file-name: choices.py import argparse def get_parser(): parser = argparse.ArgumentParser( description='choices demo') parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg']) return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() print('the arch of CNN is '.format(args.arch)) |
如果像下面這樣執行會報錯:
1 2 3 |
$ python choices.py -arch resnet usage: choices.py [-h] -arch {alexnet,vgg} choices.py: error: argument -arch: invalid choice: 'resnet' (choose from 'alexnet', 'vgg') |
因為我們所給的-arch
引數resnet
不在備選的choices
之中,所以會報錯
6. help
:指定引數的說明資訊
在現實幫助資訊的時候,help引數的值可以給使用工具的人提供該引數是用來設定什麼的說明,對於大型的專案,help引數和很有必要的,不然使用者不太明白每個引數的含義,增大了使用難度。
下面是個例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# file-name: help.py import argparse def get_parser(): parser = argparse.ArgumentParser( description='help demo') parser.add_argument('-arch', required=True, choices=['alexnet', 'vgg'], help='the architecture of CNN, at this time we only support alexnet and vgg.') return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() print('the arch of CNN is '.format(args.arch)) |
在命令列加-h
或--help
引數執行該命令,獲取幫助資訊的時候,結果如下:
1 2 3 4 5 6 7 8 9 |
$ python help.py -h usage: help.py [-h] -arch {alexnet,vgg} choices demo optional arguments: -h, --help show this help message and exit -arch {alexnet,vgg} the architecture of CNN, at this time we only support alexnet and vgg. |
7. dest
:設定引數在程式碼中的變數名
argparse預設的變數名是--
或-
後面的字串,但是你也可以通過dest=xxx
來設定引數的變數名,然後在程式碼中用args.xxx
來獲取引數的值。
8. nargs
: 設定引數在使用可以提供的個數
使用方式如下:
1 |
parser.add_argument('-name', nargs=x) |
其中x
的候選值和含義如下:
1 2 3 4 5 |
值 含義 N 引數的絕對個數(例如:3) '?' 0或1個引數 '*' 0或所有引數 '+' 所有,並且至少一個引數 |
如下例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# file-name: nargs.py import argparse def get_parser(): parser = argparse.ArgumentParser( description='nargs demo') parser.add_argument('-name', required=True, nargs='+') return parser if __name__ == '__main__': parser = get_parser() args = parser.parse_args() names = ', '.join(args.name) print('Hello to {}'.format(names)) |
執行命令和結果如下:
1 2 |
$ python nargs.py -name A B C Hello to A, B, C |
參考連結: