Skip to main content

Python 常用内置模块

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}")