1. 程式人生 > 其它 >Python中argparse模組

Python中argparse模組

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)