argparse模組入門介紹——基於python3.7
首先說明,本人是想要學習如何使用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
請讀者根據執行結果自行思考衝突引數的設定以及特點。