Python 内置模块 argparse
argparse 是 Python 标准库中用于解析命令行参数的模块,避免使用 sys.argv 来手动获取位置参数。它可以帮助我们轻松地为程序添加命令行接口,自动生成帮助信息,并处理参数验证。
基础用法
创建基本的参数解析器
import argparse
# 创建解析器
parser = argparse.ArgumentParser(description='这是一个示例程序')
# 添加位置参数
parser.add_argument('filename', help='要处理的文件名')
# 解析命令行参数
args = parser.parse_args()
print(f"文件名: {args.filename}")
运行示例:
python script.py test.txt
# 输出: 文件名: test.txt
添加可选参数
import argparse
parser = argparse.ArgumentParser(description='文件处理程序')
# 位置参数
parser.add_argument('input_file', help='输入文件路径')
# 可选参数
parser.add_argument('-o', '--output', help='输出文件路径')
parser.add_argument('-v', '--verbose', action='store_true', help='详细输出模式')
args = parser.parse_args()
print(f"输入文件: {args.input_file}")
print(f"输出文件: {args.output}")
print(f"详细模式: {args.verbose}")
运行示例:
python script.py input.txt -o output.txt --verbose
打印帮助说明
$ python script.py -h Py hello_py312
usage: script.py [-h] [-o OUTPUT] [-v] input_file
文件处理程序
positional arguments:
input_file 输入文件路径
options:
-h, --help show this help message and exit
-o OUTPUT, --output OUTPUT
输出文件路径
-v, --verbose 详细输出模式
参数类型和验证
指定参数类型
import argparse
parser = argparse.ArgumentParser(description='数学运算程序')
parser.add_argument('numbers', type=int, nargs='+', help='要处理的数字列表')
parser.add_argument('--multiply', type=float, default=1.0, help='乘数因子')
parser.add_argument('--precision', type=int, choices=[1, 2, 3], default=2, help='小数精度')
args = parser.parse_args()
result = sum(args.numbers) * args.multiply
print(f"结果: {result:.{args.precision}f}")
print(f"处理的数字: {args.numbers}")
文件类型参数
import argparse
parser = argparse.ArgumentParser(description='文件读写程序')
parser.add_argument('--input', type=argparse.FileType('r'),
default='-', help='输入文件 (默认标准输入)')
parser.add_argument('--output', type=argparse.FileType('w'),
default='-', help='输出文件 (默认标准输出)')
args = parser.parse_args()
# 读取输入文件内容
content = args.input.read()
# 写入输出文件
args.output.write(f"处理后的内容: {content.upper()}")
# 关闭文件
if args.input.name != '<stdin>':
args.input.close()
if args.output.name != '<stdout>':
args.output.close()
高级功能
参数组和互斥组
import argparse
parser = argparse.ArgumentParser(description='日志工具')
# 创建参数组
log_group = parser.add_argument_group('日志选项')
log_group.add_argument('--log-file', help='日志文件路径')
log_group.add_argument('--log-level', choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
default='INFO', help='日志级别')
# 创建互斥组
format_group = parser.add_mutually_exclusive_group()
format_group.add_argument('--json', action='store_true', help='JSON格式输出')
format_group.add_argument('--xml', action='store_true', help='XML格式输出')
parser.add_argument('message', help='要记录的消息')
args = parser.parse_args()
print(f"消息: {args.message}")
print(f"日志级别: {args.log_level}")
if args.json:
print("输出格式: JSON")
elif args.xml:
print("输出格式: XML")
else:
print("输出格式: 默认")
子命令
import argparse
# 主解析器
parser = argparse.ArgumentParser(description='数据库管理工具')
parser.add_argument('--config', help='配置文件路径')
# 创建子命令解析器
subparsers = parser.add_subparsers(dest='command', help='可用命令')
# 创建 create 子命令
create_parser = subparsers.add_parser('create', help='创建数据库')
create_parser.add_argument('name', help='数据库名称')
create_parser.add_argument('--encoding', default='utf8', help='编码格式')
# 创建 delete 子命令
delete_parser = subparsers.add_parser('delete', help='删除数据库')
delete_parser.add_argument('name', help='数据库名称')
delete_parser.add_argument('--force', action='store_true', help='强制删除')
# 创建 list 子命令
list_parser = subparsers.add_parser('list', help='列出所有数据库')
list_parser.add_argument('--format', choices=['table', 'json'],
default='table', help='输出格式')
args = parser.parse_args()
if args.command == 'create':
print(f"创建数据库: {args.name}, 编码: {args.encoding}")
elif args.command == 'delete':
force_msg = " (强制)" if args.force else ""
print(f"删除数据库: {args.name}{force_msg}")
elif args.command == 'list':
print(f"列出数据库, 格式: {args.format}")
else:
parser.print_help()
从文件读取参数
import argparse
parser = argparse.ArgumentParser(fromfile_prefix_chars='@')
parser.add_argument('--host', default='localhost')
parser.add_argument('--port', type=int, default=8080)
parser.add_argument('--debug', action='store_true')
parser.add_argument('command', choices=['start', 'stop', 'restart'])
# 可以创建 config.txt 文件包含参数
# 内容示例:
# --host
# 192.168.1.100
# --port
# 9000
# --debug
# start
args = parser.parse_args()
print(f"主机: {args.host}:{args.port}")
print(f"调试模式: {args.debug}")
print(f"命令: {args.command}")