argparse模块——命令行参数解析

简介

当我们开发 Python 脚本时,往往需要从命令行传递参数以控制脚本的行为。比如,一个数据处理脚本可以通过传递不同的文件名、处理方式、或者其他参数来实现不同的功能。为了简化命令行参数的处理,Python 标准库提供了 argparse 模块,它可以帮助我们轻松地解析用户传递的参数,并且可以生成帮助文档。

本篇文章将介绍 argparse 模块的用法,帮助你快速掌握 argparse 模块,以应对命令行参数处理的需求。

argparse 的核心概念

在介绍具体使用之前,我们需要了解一些 argparse 模块的基本概念:

  • ArgumentParserargparse 模块的核心类,用于创建一个命令行参数解析器。
  • 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_truestore_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 addgit 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_groupadd_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 脚本命令行参数的强大工具,它不仅支持位置参数、可选参数,还支持布尔类型参数、多子命令等功能。此外,它还能够为用户自动生成详细的帮助信息,大大简化了编写用户友好的命令行工具的流程。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇