1. 程式人生 > >argparse簡要用法總結

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=inttype=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

參考連結: