1. 程式人生 > >argparse模組入門介紹——基於python3.7

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
請讀者根據執行結果自行思考衝突引數的設定以及特點。