Python的argparse模块是标准库中用于解析命令行参数的核心工具。它能够自动生成帮助信息、处理无效参数,并支持位置参数、可选参数、默认值等功能。
一、ArgumentParser对象
ArgumentParser是argparse模块的核心类,用于创建命令行解析器。
1. ArgumentParser构造器
语法格式
argparse.ArgumentParser(prog=None, description=None, epilog=None, add_help=True, ...)
参数说明
| | |
|---|
prog | | prog='myapp' |
description | | description='我的程序' |
epilog | | epilog='更多信息' |
add_help | | add_help=True |
示例
import argparse# 基本创建parser = argparse.ArgumentParser(description='一个示例程序')print("基本解析器已创建")# 自定义程序名parser = argparse.ArgumentParser( prog='myapp', description='我的应用程序', epilog='了解更多请访问 example.com')parser.print_help()
输出:
usage: myapp [-h]我的应用程序options: -h, --help show this help message and exit了解更多请访问 example.com
2. ArgumentParser常用方法
语法格式
parser.add_argument(...)parser.parse_args(args=None, namespace=None)parser.print_help()
方法说明
| | |
|---|
add_argument(...) | | parser.add_argument('--name') |
parse_args(args) | | parser.parse_args() |
print_help() | | parser.print_help() |
二、定义参数
add_argument()方法用于向解析器添加命令行参数。
1. add_argument()基本参数
语法格式
parser.add_argument(name或flags, type=None, default=None, help=None, ...)
参数说明
| | |
|---|
name | | add_argument('filename') |
flags | | add_argument('-v', '--verbose') |
type | | type=int |
default | | default='value' |
help | | help='帮助信息' |
示例
import argparseparser = argparse.ArgumentParser(description='参数示例')# 位置参数parser.add_argument('input_file')# 可选参数parser.add_argument('-o', '--output')parser.add_argument('-v', '--verbose', action='store_true')# 解析测试args = parser.parse_args(['data.txt', '--output', 'result.txt', '-v'])print(f"输入文件: {args.input_file}")print(f"输出文件: {args.output}")print(f"详细模式: {args.verbose}")
输出:
输入文件: data.txt输出文件: result.txt详细模式: True
2. action参数
action参数控制参数如何处理。
语法格式
parser.add_argument(..., action='store')
action值说明
| | |
|---|
store | | action='store' |
store_true | | action='store_true' |
store_false | | action='store_false' |
append | | action='append' |
count | | action='count' |
示例
import argparseparser = argparse.ArgumentParser()# 布尔开关parser.add_argument('-v', '--verbose', action='store_true')parser.add_argument('-q', '--quiet', action='store_true')# 追加多个值parser.add_argument('--name', action='append')# 计数parser.add_argument('-d', '--debug', action='count', default=0)# 测试args = parser.parse_args(['-vv', '--name=Alice', '--name=Bob', '-ddd'])print(f"verbose: {args.verbose}")print(f"quiet: {args.quiet}")print(f"name: {args.name}")print(f"debug级别: {args.debug}")
输出:
verbose: Truequiet: Falsename: ['Alice', 'Bob']debug级别: 3
3. nargs参数
nargs参数指定参数消耗的参数数量。
语法格式
parser.add_argument(..., nargs=N)
nargs值说明
| | |
|---|
N | | nargs=2 |
? | | nargs='?' |
* | | nargs='*' |
+ | | nargs='+' |
示例
import argparseparser = argparse.ArgumentParser()# 固定数量parser.add_argument('--coords', nargs=2, type=int)parser.add_argument('files', nargs=3)# 可选数量parser.add_argument('--optional', nargs='?')parser.add_argument('--multiple', nargs='*')# 至少一个parser.add_argument('--required', nargs='+')args = parser.parse_args(['a.txt', 'b.txt', 'c.txt', '--coords', '10', '20','--multiple', 'x', 'y'])print(f"files: {args.files}")print(f"coords: {args.coords}")print(f"optional: {args.optional}")print(f"multiple: {args.multiple}")
输出:
files: ['a.txt', 'b.txt', 'c.txt']coords: [10, 20]optional: Nonemultiple: ['x', 'y']
4. choices参数
choices限制参数的可选值。
语法格式
parser.add_argument(..., choices=['值1', '值2', ...])
参数说明
| | |
|---|
choices | | choices=['low', 'high'] |
示例
import argparseparser = argparse.ArgumentParser()# 限制可选值parser.add_argument('--level', choices=['low', 'medium', 'high'])parser.add_argument('-v', '--verbosity', choices=[0, 1, 2], type=int)# 测试args = parser.parse_args(['--level', 'high', '-v', '2'])print(f"level: {args.level}")print(f"verbosity: {args.verbosity}")
输出:
level: highverbosity: 2
5. required参数
required使可选参数变为必需的。
语法格式
parser.add_argument(..., required=True)
参数说明
示例
import argparseparser = argparse.ArgumentParser()# 强制要求的可选参数parser.add_argument('--config', required=True, help='配置文件路径')parser.add_argument('--mode', choices=['dev', 'prod'], default='dev')# 测试缺少必需参数print("=== 缺少必需参数 ===")import systry: args = parser.parse_args([])except SystemExit: print("解析失败:缺少必需参数")# 提供必需参数args = parser.parse_args(['--config', 'app.conf'])print(f"\n提供必需参数:")print(f"config: {args.config}")
输出:
=== 缺少必需参数 ===usage: arg_example.py [-h] --config CONFIGarg_example.py: error: the following arguments are required: --config解析失败:缺少必需参数提供必需参数:config: app.conf
三、解析参数
parse_args()方法执行参数解析。
1. parse_args()方法
语法格式
args = parser.parse_args(args=None, namespace=None)
参数说明
| | |
|---|
args | | parse_args(['--name', 'value']) |
namespace | | parse_args(namespace=obj) |
示例
import argparseparser = argparse.ArgumentParser()parser.add_argument('--name', default='World')parser.add_argument('--count', type=int, default=1)# 从列表解析args = parser.parse_args(['--name', 'Alice', '--count', '3'])print(f"从列表解析: name={args.name}, count={args.count}")
输出:
从列表解析: name=Alice, count=3
2. 访问解析结果
语法格式
args.属性名vars(args)
示例
import argparseparser = argparse.ArgumentParser()parser.add_argument('filename')parser.add_argument('-n', '--name', default='unnamed')parser.add_argument('--age', type=int)args = parser.parse_args(['data.csv', '--name', 'Test', '--age', '25'])# 访问方式1:属性访问print(f"属性访问: filename={args.filename}, name={args.name}")# 访问方式2:vars()转换为字典print(f"字典形式: {vars(args)}")
输出:
属性访问: filename=data.csv, name=Test字典形式: {'filename': 'data.csv', 'name': 'Test', 'age': 25}
3. parse_known_args()方法
parse_known_args()处理未知参数。
语法格式
args, extras = parser.parse_known_args(args=None, namespace=None)
示例
import argparseparser = argparse.ArgumentParser()parser.add_argument('--known', default='default')# 使用parse_known_argsprint("=== parse_known_args解析 ===")args, extras = parser.parse_known_args(['--known', 'value', '--unknown', 'x'])print(f"已知参数: known={args.known}")print(f"未知参数: {extras}")
输出:
=== parse_known_args解析 ===已知参数: known=value未知参数: ['--unknown', 'x']
四、参数分组
参数分组可以组织相关的参数。
1. add_argument_group()方法
语法格式
group = parser.add_argument_group(title=None, description=None)group.add_argument(...)
方法说明
| | |
|---|
add_argument_group(title) | | add_argument_group('基本选项') |
示例
import argparseparser = argparse.ArgumentParser(description='程序参数示例')# 创建参数组basic_group = parser.add_argument_group('基本选项')basic_group.add_argument('--name', default='app')basic_group.add_argument('--version', action='store_true')advanced_group = parser.add_argument_group('高级选项')advanced_group.add_argument('--debug', action='store_true')advanced_group.add_argument('--config', default='config.yaml')parser.print_help()
输出:
usage: arg_example.py [-h] [--name NAME] [--version] [--debug] [--config CONFIG]程序参数示例optional arguments: -h, --help show this help message and exit基本选项: --name NAME --version高级选项: --debug --config CONFIG
五、互斥参数
互斥参数组确保同时只能使用其中一个。
1. add_mutually_exclusive_group()方法
语法格式
group = parser.add_mutually_exclusive_group(require=False)group.add_argument(...)
方法说明
| | |
|---|
add_mutually_exclusive_group() | | add_mutually_exclusive_group() |
示例
import argparseparser = argparse.ArgumentParser()# 创建互斥组group = parser.add_mutually_exclusive_group()group.add_argument('--short', action='store_true')group.add_argument('--long', action='store_true')# 测试print("=== 只使用一个参数 ===")args = parser.parse_args(['--short'])print(f"short={args.short}, long={args.long}")print("\n=== 同时使用两个参数 ===")try: args = parser.parse_args(['--short', '--long'])except SystemExit as e: print("错误:不能同时使用--short和--long")
输出:
=== 只使用一个参数 ===short=True, long=False=== 同时使用两个参数 ===usage: arg_example.py [-h] [--short | --long]arg_example.py: error: argument --long: not allowed with argument --short错误:不能同时使用--short和--long
六、参数格式化
帮助信息的格式化控制。
1. formatter_class参数
语法格式
argparse.ArgumentParser(formatter_class=类名)
formatter_class类说明
| | |
|---|
RawDescriptionHelpFormatter | | formatter_class=RawDescriptionHelpFormatter |
ArgumentDefaultsHelpFormatter | | formatter_class=ArgumentDefaultsHelpFormatter |
MetavarTypeHelpFormatter | | formatter_class=MetavarTypeHelpFormatter |
示例
import argparse# 显示默认值parser = argparse.ArgumentParser( formatter_class=argparse.ArgumentDefaultsHelpFormatter)parser.add_argument('--host', default='localhost')parser.add_argument('--port', type=int, default=8080)print("=== 显示默认值 ===")parser.print_help()# 显示类型print("\n=== 显示类型 ===")parser2 = argparse.ArgumentParser( formatter_class=argparse.MetavarTypeHelpFormatter)parser2.add_argument('--count', type=int)parser2.add_argument('--name', type=str)parser2.print_help()
输出:
=== 显示默认值 ===usage: arg_example.py [-h] [--host HOST] [--port PORT]optional arguments: -h, --help show this help message and exit --host HOST (default: localhost) --port PORT (default: 8080)=== 显示类型 ===usage: arg_example.py [-h] [--count int] [--name str]optional arguments: -h, --help show this help message and exit --count int --name str
七、综合示例
1. 文件处理工具
示例
import argparse# 创建解析器parser = argparse.ArgumentParser( description='文件处理工具', formatter_class=argparse.RawDescriptionHelpFormatter, epilog='示例用法: python tool.py input.txt -o output.txt -v')# 位置参数parser.add_argument('input_file', help='输入文件路径')# 可选参数parser.add_argument('-o', '--output', help='输出文件路径', default='a.out')parser.add_argument('-v', '--verbose', action='store_true', help='详细输出')parser.add_argument('-c', '--count', type=int, default=1, help='处理次数')parser.add_argument('--mode', choices=['copy', 'move', 'delete'], default='copy')# 解析参数(显式传入模拟参数列表,避免依赖 sys.argv)args = parser.parse_args(['data.txt', '-o', 'result.txt', '-v'])# 使用参数print(f"输入文件: {args.input_file}")print(f"输出文件: {args.output}")print(f"详细模式: {args.verbose}")print(f"处理次数: {args.count}")print(f"处理模式: {args.mode}")
运行示例:
python tool.py data.txt -o result.txt -v --mode copy
输出:
输入文件: data.txt输出文件: result.txt详细模式: True处理次数: 1处理模式: copy