首先說明,本人是想要學習如何使用argparse子產品,打造指令行程式。
但是網絡上的各種教程寫的隻能說是慘不忍睹,反人類來形容。這樣的文章寫出來純粹浪費大家時間。
找了很久,找到了python官方推薦的入門教程,看下來非常好。但是沒有中文版。
本人嘗試根據該教程,将argparse的核心使用方法做一介紹。
注:代碼均命名為 1.py.
1. 指令行程式架構
代碼如下:
import argparse
parser = argparse.ArgumentParser(description="程式的主要功能是...")
parser.parse_args()
執行代碼:
python 1.py --help
執行結果:
usage: 1.py [-h]
程式的主要功能是...
optional arguments:
-h, --help show this help message and exit
--help選項就是将指令行參數說一個說明。
-h 是 --help的縮寫形式,二者效果相同。
如程式中展示的,可以通過description參數來對程式的主要功能做出說明。
2. 添加一個位置參數
代碼如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo")
args = parser.parse_args()
print('參數echo的值是{}'.format(args.echo))
執行代碼:
python 1.py 'hello'
執行結果:
參數echo的值是hello
以上代碼就是添加一個參數,存儲在名字為'echo'的變量裡面。
注意,要擷取變量的值,需要先通過parse_args()方法擷取args對象。
是以指令行資訊都可以通過args對象取值獲得。
注意,由于這裡指定了位置參數,也就是說,如果執行程式時沒有攜帶參數,則會報錯。
執行代碼:
python 1.py 'hello'
執行結果:
usage: 1.py [-h] echo
1.py: error: the following arguments are required: echo
3. 為位置參數添加說明
代碼如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("echo", help="我是關于echo的說明")
args = parser.parse_args()
print('參數echo的值是{}'.format(args.echo))
執行-h選項:
python 1.py -h
執行結果:
positional arguments:
echo 我是關于echo的說明
optional arguments:
-h, --help show this help message and exit
可以看見,-h的執行結果中,已經列印了代碼中為位置參數echo添加的說明。
4. 指定參數類型
代碼如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int)
args = parser.parse_args()
print(args.square**2)
執行代碼:
python 1.py 123
執行結果:
15129
注意這裡的代碼指定了一個位置參數square,并且指定類型為int。
預設情況下,如果沒有指定類型,argparse會将參數作為字元串存儲。
也就是說,,如果沒有指定類型,args.square的值是字元串'123'。
此時,在執行 args.square**2 的操作時,會報錯。
5. 指定可選參數
先看代碼:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbosity")
args = parser.parse_args()
print('可選參數verbosity的值是{}'.format(args.verbosity))
執行代碼:
python 1.py --verbosity 123
執行結果:
可選參數verbosity的值是123
注意,在參數前加上字首--,即意味着這個參數是可選參數。
可選參數與位置參數有兩點不同:
第一,可選參數可以不指定,如果這樣執行代碼:
python 1.py
則執行結果為:
可選參數verbosity的值是None
注意此時的,verbosity的值是None。
第二點不同,可選參數使用時,需要先聲明該參數,再指定該參數的值。
正如上面代碼中使用的那樣。讀者可以自行體會。
6. 設定無需具體值參數
比如說我們想要設定一個參數,如果指定了該參數,就執行一個功能,
如果沒指定,則不執行。具體該參數的值是多少在所不問。
代碼如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--verbose", action="store_true")
args = parser.parse_args()
print("參數verbose的值是{}".format(args.verbose))
執行代碼:
python 1.py --verbose
執行結果:
參數verbose的值是True
可以看到,在執行代碼時,指定了可選參數--verbose,但是沒有指定verbose的值。
此時verbose的值就預設為布爾值True。
實作這一目的的方法是将action參數的值指定為 "store_true"。
通過這個特點,就可以實作使用某一個特定功能這個目的。
7. 設定參數的簡短形式
上面我們可以注意到,-h 是 --help 和簡單形式,二者功能相同。
我們也可以為自己設定的參數指定簡短的形式。
代碼為:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v","--verbose", action="store_true")
args = parser.parse_args()
print("參數verbose的值是{}".format(args.verbose))
執行代碼:
python 1.py -v
執行結果:
參數verbose的值是True
說明,在可選參數前添加一個簡短的參數,與直接使用原參數效果相同。
8. 同時添加位置參數和可選參數
代碼如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int)
parser.add_argument("-v", "--verbose", action="store_true")
args = parser.parse_args()
if args.verbose:
print("the square of {} equals {}".format(args.square, args.square**2))
else:
print(args.square**2)
執行方式1:
python 1.py 50
執行結果1:
2500
執行方式2:
python 1.py 50 -v
執行結果2:
the square of 50 equals 2500
通過多次使用add_argument方法,來添加多個指令行參數。
9. 為可選參數設定取值範圍
代碼為:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", type=int, choices=[0, 1, 2])
args = parser.parse_args()
print("可選參數verbosity的值為{}".format(args.verbosity))
多次不同方式執行代碼:
MacBook-Pro:Desktop yao$ python 1.py
可選參數verbosity的值為None
MacBook-Pro:Desktop yao$ python 1.py -v 1
可選參數verbosity的值為1
MacBook-Pro:Desktop yao$ python 1.py -v 2
可選參數verbosity的值為2
MacBook-Pro:Desktop yao$ python 1.py -v 3
usage: 1.py [-h] [-v {0,1,2}]
1.py: error: argument -v/--verbosity: invalid choice: 3 (choose from 0, 1, 2)
說明,通過設定choices屬性,來設定可選參數的取值範圍。
如果不在取值範圍内的話,會報錯。
10. 監控可選參數的執行次數
代碼如下:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", action="count")
args = parser.parse_args()
print("可選參數verbosity的值為{}".format(args.verbosity))
以不同方式多次執行:
MacBook-Pro:Desktop yao$ python 1.py -v
可選參數verbosity的值為1
MacBook-Pro:Desktop yao$ python 1.py -vv
可選參數verbosity的值為2
MacBook-Pro:Desktop yao$ python 1.py -vvv
可選參數verbosity的值為3
MacBook-Pro:Desktop yao$ python 1.py -vvvv
可選參數verbosity的值為4
MacBook-Pro:Desktop yao$ python 1.py -vvvvv
可選參數verbosity的值為5
MacBook-Pro:Desktop yao$ python 1.py
可選參數verbosity的值為None
說明,通過設定action屬性值為 'count' ,可以監控使用了多少次可選參數。
讀者可自行根據執行結果感受該參數的作用。
11. 設定參數的預設值
代碼為:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbosity", default=0)
args = parser.parse_args()
print("可選參數verbosity的值為{}".format(args.verbosity))
不同方式多次執行:
MacBook-Pro:Desktop yao$ python 1.py
可選參數verbosity的值為0
MacBook-Pro:Desktop yao$ python 1.py -v 100
可選參數verbosity的值為100
注意此時的預設值為0,而不是None
12 設定沖突參數
沖突參數是指,兩個參數隻能二選其一。
代碼如下:
import argparse
parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
args = parser.parse_args()
print("可選參數verbosity的值為{}".format(args.verbose))
print("可選參數quiet的值為{}".format(args.quiet))
不同方式多次執行:
MacBook-Pro:Desktop yao$ python 1.py
可選參數verbosity的值為False
可選參數quiet的值為False
MacBook-Pro:Desktop yao$ python 1.py -v
可選參數verbosity的值為True
可選參數quiet的值為False
MacBook-Pro:Desktop yao$ python 1.py -q
可選參數verbosity的值為False
可選參數quiet的值為True
MacBook-Pro:Desktop yao$ python 1.py -v -q
usage: 1.py [-h] [-v | -q]
1.py: error: argument -q/--quiet: not allowed with argument -v/--verbose
MacBook-Pro:Desktop yao$ python 1.py -h
usage: 1.py [-h] [-v | -q]
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quiet
請讀者根據執行結果自行思考沖突參數的設定以及特點。