Python中argparse模組
阿新 • • 發佈:2021-07-14
linux中使用命令或者指令碼是大都可以接收引數,如
ls -l /etc
# /etc是位置引數
# -l 是短選項
在python 3.2之後提供可引數分析的模組argparse
引數分類
- 位置引數,如/etc
- 選項引數,如-l表示短選項,--list表示長選項
argparse模組介紹
通過程式定義它需要的引數,然後argparse從sys.argv解析出引數,同事生成幫助和使用手冊,並在傳入無效引數時報出錯誤資訊。
基本使用流程
- 建立ArgumentParser()物件
- 呼叫add_argument()方法新增引數
- 使用parse_args()解析新增的引數
建立一個指令碼:
import argparse parse = argparse.ArgumentParser() # 獲取引數解析器 parse.parse_args() # 分析引數
在shell中呼叫此指令碼
# 沒有任何輸出 (trydrf) localhost:py_scripts yull$ python3 dentest.py # 預設短選項,列印幫助資訊 (trydrf) localhost:py_scripts yull$ python3 dentest.py -h usage: dentest.py [-h] optional arguments: -h, --help show this help message and exit # 長選項列印幫助資訊,預設存在此選項 (trydrf) localhost:py_scripts yull$ python3 dentest.py --help usage: dentest.py [-h] optional arguments: -h, --help show this help message and exit # 未定義-v引數,報錯 (trydrf) localhost:py_scripts yull$ python3 dentest.py -v usage: dentest.py [-h] dentest.py: error: unrecognized arguments: -v (trydrf) localhost:py_scripts yull$
上面的指令碼可選引數只有--help和-h,如果需要定義其他引數,則需要呼叫add_argument()方法
解析器引數
在獲取解析器時還可以傳入解析器引數
引數名稱 | 說明 |
---|---|
prog | 程式名稱,預設使用sys.argv[0] |
add_help | 自動為解析器增加-h和--help選項,預設為True |
description | 為程式新增功能描述 |
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
位置引數
shell命令中ls /etc,/etc就是位置引數
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument('path') # 指定位置引數
args = parse.parse_args()
print(args.path)
# output
# 如果不帶引數,則會報錯
(trydrf) localhost:py_scripts yull$ python3 dentest.py
usage: ls [-h] path
ls: error: the following arguments are required: path
# 帶引數
(trydrf) localhost:py_scripts yull$ python3 dentest.py /etc
/etc
定義了一個為e的引數,預設必選,-h和--help為預設引數,可忽略。
可選引數
可選引數有兩種方式:
- 短引數,如“-h”
- 長引數,如“--help”
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-v", "--verbosity") # 新增可選引數
args = parse.parse_args()
if args.verbosity:
print("echo verbority is {}".format(args.verbosity))
# 使用短選項
(trydrf) localhost:py_scripts yull$ python3 dentest.py -v haha
echo verbority is haha
# 使用長選項
(trydrf) localhost:py_scripts yull$ python3 dentest.py --verbosity haha
echo verbority is haha
# 不新增選項,則沒有返回
(trydrf) localhost:py_scripts yull$ python3 dentest.py
# 選項為空,則會報錯
(trydrf) localhost:py_scripts yull$ python3 dentest.py -v
usage: ls [-h] [-v VERBOSITY]
ls: error: argument -v/--verbosity: expected one argument
上面指定了一個短選項-v和一個長選項--verbosity,但使用-v必須制定引數值,否者就會報錯。當然也可以定義不需要指定引數值,需要通過action='store_true'來定義
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-v", "--verbosity", action='store_true')
args = parse.parse_args()
if args.verbosity:
print("echo verbority is {}".format(args.verbosity))
如此即可使用python3 dentest.py -v
引數型別
預設的引數型別為str,如果要進行數學計算,則需要在引數進行解析後進行型別轉換,如果不轉換則會報錯
import argparse
parse = argparse.ArgumentParser()
parse.add_argument("-x", type=int, help="輸入數字") # 指定型別必須為int
args = parse.parse_args()
answer = args.x + 1
print(answer)
在shell中執行指令碼
# 傳參為數字
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 5
6
# 傳參為字串,則報錯
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x as
usage: ls [-h] [-x X]
ls: error: argument -x: invalid int value: 'as'
可選值choices
如果需要限定某個值得取值範圍,則可以使用choices來指定
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-x", type=int, help="輸入數字", choices=[2, 3, 4]) # 限定值為2,3,4
args = parse.parse_args()
answer = args.x + 1
print(answer)
在shell中執行指令碼
# 傳入範圍外的值
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 5
usage: ls [-h] [-x {2,3,4}]
ls: error: argument -x: invalid choice: 5 (choose from 2, 3, 4)
# 只能使用範圍內的值
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 2
3
幫助資訊用法
通過分組的方式將指令歸類
import argparse
parse = argparse.ArgumentParser(description='canculate X to the power of Y')
group = parse.add_argument_group() # 分組,-v和-q新增到group中,x和y新增到預設parse中
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quit", action="store_true")
parse.add_argument("x", type=int, help='the base')
parse.add_argument("y", type=int, help='the exponent')
args = parse.parse_args()
answer = args.x ** args.y
if args.quit:
print(answer)
elif args.verbose:
print("{} to the power {} equals {}".format(args.x, args.y, answer))
else:
print("{}^{} == {}".format(args.x, args.y, answer))
在shell中執行指令碼
$ python3 dentest.py -h
usage: dentest.py [-h] [-v | -q] x y
canculate X to the power of Y
positional arguments:
x the base
y the exponent
optional arguments:
-h, --help show this help message and exit
-v, --verbose
-q, --quit
互斥引數
在幫助資訊中使用parse.add_argument_group() 方式定義了組,同樣也可以定義互斥引數,使用parse.add_mutually_exclusive_group()
group = parse.add_mutually_exclusive_group() # 定義互斥引數,group下的引數只能同時出現一個
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quit", action="store_true")
引數預設值
通過引數預設值的方式,可以預設省略一些引數
import argparse
parse = argparse.ArgumentParser(prog='ls', add_help=True, description='list directory contents')
parse.add_argument("-x", type=int,
help="輸入數字",
choices=[2, 3, 4],
default=2) # 定義預設值
args = parse.parse_args()
answer = args.x + 1
print(answer)
在shell中執行指令碼
# 不傳引數,預設值為2
(trydrf) localhost:py_scripts yull$ python3 dentest.py
3
# 傳入引數
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 3
4
# 超出可選範圍
(trydrf) localhost:py_scripts yull$ python3 dentest.py -x 6
usage: ls [-h] [-x {2,3,4}]
ls: error: argument -x: invalid choice: 6 (choose from 2, 3, 4)