简介
当我们开发 Python 脚本时,往往需要从命令行传递参数以控制脚本的行为。比如,一个数据处理脚本可以通过传递不同的文件名、处理方式、或者其他参数来实现不同的功能。为了简化命令行参数的处理,Python 标准库提供了 argparse
模块,它可以帮助我们轻松地解析用户传递的参数,并且可以生成帮助文档。
本篇文章将介绍 argparse
模块的用法,帮助你快速掌握 argparse
模块,以应对命令行参数处理的需求。
argparse 的核心概念
在介绍具体使用之前,我们需要了解一些 argparse
模块的基本概念:
- ArgumentParser:
argparse
模块的核心类,用于创建一个命令行参数解析器。 - add_argument:用于定义需要解析的参数,可以是位置参数或可选参数。
- parse_args:用于解析命令行参数,返回一个包含解析结果的命名空间对象。
创建解析器
使用 argparse
的第一步是创建一个 ArgumentParser
对象。这个对象是整个参数解析的基础,它允许我们定义所需的命令行参数并处理它们。
import argparse
# 创建解析器对象
parser = argparse.ArgumentParser(description="一个简单的 argparse 示例")
在这个示例中,我们通过 ArgumentParser
创建了一个解析器,并使用 description
参数为这个解析器添加了一段说明信息,当用户请求帮助时,说明信息会显示在帮助文档中。
添加位置参数
位置参数是命令行中必须传递的参数,不能省略。例如,定义一个程序需要用户输入名字和年龄,名字是位置参数:
parser.add_argument("name", help="用户的名字")
在这个例子中,name
是用户必须输入的值,而 help
参数为该参数提供了描述信息,方便用户理解该参数的用途。
添加可选参数
与位置参数不同,可选参数(也叫做选项参数)可以不传递,通常以 -
或 --
开头。它们允许用户在运行脚本时指定额外的配置。例如,定义一个年龄参数可以是可选的:
parser.add_argument("-a", "--age", type=int, help="用户的年龄")
在这里,-a
是短选项,--age
是长选项,type=int
指定参数的类型为整数。如果用户没有提供这个参数,它的值会为 None
。
解析参数
当所有的参数都添加完毕后,接下来就可以解析命令行输入的参数了。使用 parse_args()
方法来获取命令行传递的参数:
args = parser.parse_args()
print(f"名字: {args.name}")
if args.age:
print(f"年龄: {args.age}")
参数类型与默认值
默认情况下,argparse
会将命令行参数作为字符串处理。通过 type
参数,你可以将输入的参数转换为指定类型,如整数、浮点数等。如果你想设置可选参数的默认值,可以通过 default
参数指定。
parser.add_argument("-c", "--count", type=int, default=1, help="计数值")
在这里,count
参数的默认值是 1
,用户如果没有指定该参数,它将自动使用默认值。
参数的必填与可选性
在命令行参数解析中,位置参数是必填的,而可选参数可以是非必填的。这是它们之间的显著区别:
- 位置参数:必须按照命令行传递顺序提供,否则会抛出错误。
- 可选参数:可以不提供,使用默认值。
示例1
运行以下命令:
python .\test.py 小明 -a 18
或
python .\test.py 小明 --age 18
输出将会是:
名字: 小明
年龄: 18
示例2
运行以下命令:
python .\test.py 小明
输出将会是:
名字: 小明
处理布尔参数(开关)
对于布尔参数,通常用于设置标志或开关(如是否启用调试模式)。我们可以使用 action="store_true"
或 store_false
来设置一个布尔类型的参数,这里指定的store_true
和store_false
决定了不传递该参数时的默认值。该参数在命令行中只需作为开关出现,无需传递具体值。
parser.add_argument("--verbose", action="store_true", help="启用详细输出")
当用户在命令行中使用 --verbose
时,该值将自动设为 True
,否则为 False
。
自动生成帮助信息
argparse
还会为我们自动生成非常友好的帮助信息,用户只需在命令行中输入 -h
或 --help
,就能看到参数的详细说明:
python .\test.py -h
输出示例:
usage: test.py [-h] [-a AGE] name
一个简单的 argparse 示例
positional arguments:
name 用户的名字
options:
-h, --help show this help message and exit
-a AGE, --age AGE 用户的年龄
多个子命令支持
argparse
还支持多个子命令解析,比如像 git
这样的工具可以支持不同的命令(git add
、git commit
等)。可以使用 subparsers
来处理子命令。
parser = argparse.ArgumentParser()
# 创建子命令解析器
subparsers = parser.add_subparsers(dest="command")
# 子命令1
parser_a = subparsers.add_parser("start", help="启动命令")
parser_a.add_argument("task", help="需要启动的任务")
# 子命令2
parser_b = subparsers.add_parser("stop", help="停止命令")
parser_b.add_argument("task", help="需要停止的任务")
# 解析参数
args = parser.parse_args()
# 处理子命令
if args.command == "start":
print(f"启动任务 {args.task}")
elif args.command == "stop":
print(f"停止任务 {args.task}")
示例1
运行
python .\test2.py -h
usage: test2.py [-h] {start,stop} ...
positional arguments:
{start,stop}
start 启动命令
stop 停止命令
options:
-h, --help show this help message and exit
示例2
运行
python .\test2.py start -h
usage: test2.py start [-h] task
positional arguments:
task 需要启动的任务
options:
-h, --help show this help message and exit
参数组与互斥
如果你想将一些参数归类到一起,或是规定某些参数互斥,可以使用 argparse
的高级功能,如 add_argument_group
和 add_mutually_exclusive_group
。
参数组
group = parser.add_argument_group("文件参数")
group.add_argument("-i", "--input", help="输入文件")
group.add_argument("-o", "--output", help="输出文件")
互斥
mutex_group = parser.add_mutually_exclusive_group()
mutex_group.add_argument("--verbose", action="store_true", help="启用详细输出")
mutex_group.add_argument("--quiet", action="store_true", help="启用静默模式")
示例
import argparse
parser = argparse.ArgumentParser()
group = parser.add_argument_group("文件参数")
group.add_argument("-i", "--input", help="输入文件")
group.add_argument("-o", "--output", help="输出文件")
mutex_group = parser.add_mutually_exclusive_group()
mutex_group.add_argument("--verbose", action="store_true", help="启用详细输出")
mutex_group.add_argument("--quiet", action="store_true", help="启用静默模式")
args = parser.parse_args()
示例1
运行
python .\test3.py -h
usage: test3.py [-h] [-i INPUT] [-o OUTPUT] [--verbose | --quiet]
options:
-h, --help show this help message and exit
--verbose 启用详细输出
--quiet 启用静默模式
文件参数:
-i INPUT, --input INPUT
输入文件
-o OUTPUT, --output OUTPUT
输出文件
可以看到参数组会被单独列出来,不会直接放到 options。同一参数组的参数不是要同时都有,只是为了便于组织和管理。
示例2
运行
python .\test3.py --verbose --quiet
usage: test3.py [-h] [-i INPUT] [-o OUTPUT] [--verbose | --quiet]
test3.py: error: argument --quiet: not allowed with argument --verbose
同时传递互斥参数会报错。
结语
argparse
是处理 Python 脚本命令行参数的强大工具,它不仅支持位置参数、可选参数,还支持布尔类型参数、多子命令等功能。此外,它还能够为用户自动生成详细的帮助信息,大大简化了编写用户友好的命令行工具的流程。