杰瑞科技汇

Python argparse模块如何使用?

为什么使用 argparse

argparse 出现之前,开发者通常使用 sys.argv 来手动处理命令行参数,这虽然可行,但存在很多问题:

Python argparse模块如何使用?-图1
(图片来源网络,侵删)
  • 代码繁琐:需要手动解析参数列表,处理短选项(-f)和长选项(--file)。
  • 错误处理困难:难以优雅地处理用户输入错误(如缺少参数、类型错误等)。
  • 帮助信息不统一:需要手动编写 -h--help 的输出信息。

argparse 解决了所有这些问题,它提供了:

  • 自动生成帮助信息:根据你定义的参数,自动生成 -h--help 的输出。
  • 类型检查和转换:自动将参数转换为指定的数据类型(如整数、浮点数)。
  • 错误提示:当用户输入无效参数时,程序会自动报错并退出。
  • 丰富的参数类型:支持位置参数、可选参数、布尔标志、数量参数等。

argparse 的基本使用步骤

使用 argparse 主要遵循以下四个步骤:

  1. 导入模块import argparse
  2. 创建解析器对象parser = argparse.ArgumentParser(description='...')
  3. 添加参数:使用 parser.add_argument() 定义程序接受的命令行参数。
  4. 解析参数:使用 args = parser.parse_args() 解析命令行输入,并将结果存储在 args 对象中。

一个简单的例子

让我们从一个最简单的例子开始,逐步理解。

目标:编写一个脚本,接受一个文件名和一个数字,并打印它们。

Python argparse模块如何使用?-图2
(图片来源网络,侵删)

代码 (my_script.py):

import argparse
# 1. 创建解析器对象
# description 参数会在帮助信息的开头显示
parser = argparse.ArgumentParser(description="一个简单的脚本示例。")
# 2. 添加参数
# 添加一个位置参数 'filename'
# type: 指定参数类型
# help: 为该参数提供帮助信息
parser.add_argument("filename", type=str, help="要处理的文件名")
# 添加一个可选参数 '--count' 或 '-c'
# action='store_true': 表示这是一个布尔标志,如果出现该参数,则值为 True,否则为 False
parser.add_argument("-c", "--count", action="store_true", help="是否显示计数")
# 添加一个带值的有可选参数 '--number' 或 '-n'
# type: 指定参数类型
# default: 如果用户不提供该参数,则使用默认值
parser.add_argument("-n", "--number", type=int, default=1, help="一个数字,默认为1")
# 3. 解析参数
# parse_args() 会从 sys.argv 中解析参数
args = parser.parse_args()
# 4. 使用解析后的参数
print(f"文件名: {args.filename}")
print(f"是否计数: {args.count}")
print(f"数字: {args.number}")

如何运行这个脚本?

  1. 查看帮助信息 在命令行中运行 python my_script.py -hpython my_script.py --help

    $ python my_script.py -h
    usage: my_script.py [-h] [-c] [-n NUMBER] filename
    一个简单的脚本示例。
    positional arguments:
      filename              要处理的文件名
    options:
      -h, --help            show this help message and exit
      -c, --count           是否显示计数
      -n NUMBER, --number NUMBER
                            一个数字,默认为1

    你可以看到 argparse 自动为我们生成了清晰的使用说明。

  2. 不带任何参数运行 会报错,因为 filename 是一个位置参数,是必需的。

    Python argparse模块如何使用?-图3
    (图片来源网络,侵删)
    $ python my_script.py
    usage: my_script.py [-h] [-c] [-n NUMBER] filename
    my_script.py: error: the following arguments are required: filename
  3. 提供必需的参数

    $ python my_script.py data.txt
    文件名: data.txt
    是否计数: False
    数字: 1
  4. 使用可选参数

    $ python my_script.py data.txt -c -n 5
    文件名: data.txt
    是否计数: True
    数字: 5

add_argument() 的核心参数详解

add_argument()argparse 的核心,它的参数定义了命令行参数的行为。

1 参数名称

  • 位置参数:直接提供一个字符串,如 parser.add_argument("filename"),这些参数是必需的,其顺序由用户在命令行中提供的位置决定。
  • 可选参数:以 或 开头,如 parser.add_argument("-f", "--file"),用户可以选择是否提供,短选项(如 -f)是可选的。

2 action:参数如何处理

这是 action 参数最常用的几个值:

  • 'store' (默认行为): 将参数的值存储下来。

    parser.add_argument("--name", action="store", default="Guest")
    # 运行: python script.py --name Alice  -> args.name = "Alice"
    # 运行: python script.py              -> args.name = "Guest"
  • 'store_true' / 'store_false': 用于布尔标志,如果参数出现,则存储 True / False,否则存储默认值 False / True

    parser.add_argument("-v", "--verbose", action="store_true", help="启用详细模式")
    # 运行: python script.py -v -> args.verbose = True
    # 运行: python script.py    -> args.verbose = False
  • 'store_const': 存储一个预定义的常量,常量由 const 参数指定。

    parser.add_argument("--mode", action="store_const", const="DEBUG", default="INFO")
    # 运行: python script.py --mode -> args.mode = "DEBUG"
    # 运行: python script.py        -> args.mode = "INFO"
  • 'append': 将参数的值添加到一个列表中,可以多次使用该参数。

    parser.add_argument("--file", action="append", default=[])
    # 运行: python script.py --file a.txt --file b.txt -> args.file = ['a.txt', 'b.txt']
  • 'count': 计算参数出现的次数,常用于增加日志级别等。

    parser.add_argument("-v", "--verbose", action="count", default=0)
    # 运行: python script.py -v   -> args.verbose = 1
    # 运行: python script.py -vv  -> args.verbose = 2
  • 'help' (默认): 打印帮助信息并退出。

  • 'version': 打印版本信息并退出,需要配合 version 参数使用。

    parser.add_argument("--version", action="version", version='%(prog)s 1.0')
    # 运行: python script.py --version -> 输出: my_script.py 1.0

3 type:参数类型

argparse 默认将所有参数视为字符串,你可以用 type 参数来指定类型,argparse 会自动进行转换。

parser.add_argument("width", type=int)
parser.add_argument("height", type=float)
parser.add_argument("files", type=argparse.FileType('r')) # 可以直接打开文件

如果转换失败(例如输入非数字给 int),argparse 会自动报错。

4 default:默认值

如果用户没有提供该可选参数,则使用这个默认值。

parser.add_argument("--port", type=int, default=8080)

5 required:是否必需

将可选参数设为必需的,这对于那些虽然以 开头但逻辑上必须提供的参数很有用。

parser.add_argument("--config", type=str, required=True, help="配置文件的路径")

6 helpmetavar

  • help: 参数的帮助信息,会在 -h 中显示。
  • metavar: 在帮助信息中显示的参数名称,默认是参数的全大写形式,当你有多个参数时,metavar 可以让帮助信息更清晰。
# 默认帮助信息会显示: output_file input_file
# parser.add_argument("input_file")
# parser.add_argument("output_file")
# 使用 metavar 可以自定义
parser.add_argument("input_file", metavar="源文件")
parser.add_argument("output_file", metavar="目标文件")
# 帮助信息会显示: 源文件 目标文件

7 choices:限制参数值

参数的值必须是 choices 列表中的一个。

parser.add_argument("--log-level", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'], default='INFO')
# 运行: python script.py --log-level DEBUG   -> 正确
# 运行: python script.py --log-level FATAL   -> 错误: error: argument --log-level: invalid choice: 'FATAL' (choose from 'DEBUG', 'INFO', 'WARNING', 'ERROR')

高级用法

1 互斥参数组

某些参数是互斥的,用户只能选择其中一个。--encrypt--decrypt 不能同时使用。

import argparse
parser = argparse.ArgumentParser()
# 创建互斥组
group = parser.add_mutually_exclusive_group()
# 向组中添加参数
group.add_argument("--encrypt", action="store_true", help="加密模式")
group.add_argument("--decrypt", action="store_true", help="解密模式")
parser.add_argument("filename", help="要处理的文件")
args = parser.parse_args()
if args.encrypt:
    print(f"正在加密文件 {args.filename}...")
elif args.decrypt:
    print(f"正在解密文件 {args.filename}...")
else:
    print("请选择加密或解密模式。")

如果同时提供 --encrypt--decryptargparse 会报错。

2 可选参数组

你可以将相关的参数分组,使帮助信息更有条理。

import argparse
parser = argparse.ArgumentParser(description="一个功能丰富的脚本")
# 创建参数组
group1 = parser.add_argument_group('网络设置')
group1.add_argument("--host", default="localhost", help="服务器主机")
group1.add_argument("--port", type=int, default=8080, help="服务器端口")
group2 = parser.add_argument_group('输出选项')
group2.add_argument("-v", "--verbose", action="store_true", help="启用详细输出")
group2.add_argument("-q", "--quiet", action="store_true", help="静默模式")
args = parser.parse_args()

运行 python script.py -h 会看到参数被清晰地分成了两组。


完整综合示例

下面是一个综合运用了上述知识点的完整例子。

目标:一个模拟的文件备份工具,可以指定源目录、目标目录,并可以选择是否压缩、是否显示进度。

代码 (backup_tool.py):

import argparse
import os
import sys
def main():
    # 1. 创建解析器
    parser = argparse.ArgumentParser(
        description="一个简单的文件备份工具。",
        formatter_class=argparse.ArgumentDefaultsHelpFormatter # 显示默认值
    )
    # 2. 添加参数
    # 位置参数:源目录
    parser.add_argument(
        "source",
        type=str,
        help="源目录的路径"
    )
    # 可选参数:目标目录
    parser.add_argument(
        "-d", "--destination",
        type=str,
        default="./backup",
        help="备份目标目录的路径"
    )
    # 互斥的布尔标志:压缩或显示进度
    group = parser.add_mutually_exclusive_group()
    group.add_argument(
        "-z", "--zip",
        action="store_true",
        help="将备份结果压缩为 .zip 文件"
    )
    group.add_argument(
        "-p", "--progress",
        action="store_true",
        help="显示备份进度"
    )
    # 带值的选择:日志级别
    parser.add_argument(
        "--log-level",
        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
        default='INFO',
        help="设置日志级别"
    )
    # 3. 解析参数
    args = parser.parse_args()
    # 4. 使用参数并执行逻辑
    print("--- 备份工具配置 ---")
    print(f"源目录: {os.path.abspath(args.source)}")
    print(f"目标目录: {os.path.abspath(args.destination)}")
    print(f"压缩模式: {'是' if args.zip else '否'}")
    print(f"显示进度: {'是' if args.progress else '否'}")
    print(f"日志级别: {args.log_level}")
    print("---------------------")
    # 这里是实际的备份逻辑...
    if not os.path.isdir(args.source):
        print(f"错误: 源目录 '{args.source}' 不存在!", file=sys.stderr)
        sys.exit(1)
    if args.progress:
        print("开始备份... (模拟进度)")
        # 模拟进度
        for i in range(1, 6):
            print(f"进度: {i * 20}%")
        print("备份完成!")
if __name__ == "__main__":
    main()

如何运行这个综合示例?

# 查看帮助信息(注意默认值和分组)
$ python backup_tool.py -h
# 基本备份
$ python backup_tool.py my_project
# 指定目标目录和压缩模式
$ python backup_tool.py my_project -d ./my_backups -z
# 显示进度,并设置日志级别
$ python backup_tool.py my_project -p --log-level DEBUG
# 尝试使用互斥参数(会报错)
$ python backup_tool.py my_project -z -p
usage: backup_tool.py [-h] [-d DESTINATION] [-z] [-p] [--log-level {DEBUG,INFO,WARNING,ERROR}] source
backup_tool.py: error: argument -p/--progress: not allowed with argument -z/--zip

argparse 是 Python 开发者必备的工具,通过掌握其核心概念——创建解析器、添加参数、解析参数,你可以轻松地为你的脚本创建专业、健壮且用户友好的命令行界面。-h 是你最好的朋友,在不确定时,随时用它来查看参数的帮助信息。

分享:
扫描分享到社交APP
上一篇
下一篇