展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > Python标准库argparse解析命令行参数使用详细介绍

Python标准库argparse解析命令行参数使用详细介绍

Python标准库argparse用于解析命令行参数,支持位置参数、可选参数、类型转换、默认值、互斥组及子命令等。通过ArgumentParser创建解析器,add_argument添加参数,parse_args解析。action参数可实现布尔开关、计数、追加等行为。子命令由add_subparsers管理,可绑定处理函数,提升CLI工具开发效率。

前言

argparse 是 Python 标准库里命令行参数解析的利器,几乎每个 CLI 工具都会用到它。它的设计哲学就是“零门槛上手,高阶玩法也能兜住”。从简单的位置参数到复杂的嵌套子命令,一套 API 全搞定。下面我们直接看怎么用。

Python标准库argparse解析命令行参数使用详细介绍

基本使用

import argparse
# 创建解析器
## description: 程序说明
## prog: 程序名, 默认为脚本名
## epilog: 帮助信息末尾附加文本
## formatter_class: 控制帮助信息的展示样式
parser = argparse.ArgumentParser(
    prog="/my_tool",
    description="A simple command-line tool.",
    epilog="Example usage: /my_tool 'Hello World' --verbose"
)
# 使用add_argument() 添加参数
# echo1和echo2为位置参数,使用时必需按顺序提供
# type 指定类型转换函数
# help 设置帮助说明
parser.add_argument("echo1", type=str, help="echo something")
parser.add_argument("echo2", type=str, help="echo something")
# -x 或 --xx 为可选参数
# default 设置默认值
parser.add_argument("--sftp_ip",type=str,default="127.0.0.1", help="sftp服务的IP地址")
# 自动转换类型成int
# meta var 修改帮助信息中显示的占位名
parser.add_argument("--sftp_port", meta var="PORT", type=int, default="22")
# dest 指定解析后属性名, 解析后使用 args.username 访问
parser.add_argument("--user-name", dest="username")
# required 让可选参数变成必须提供
# required 只适用于可选参数
parser.add_argument("--name", required=True)
# choice 限制可选值范围
parser.add_argument("-H","--host",type=str, choices=["127.0.0.1", "192.168.0.10"])
# nargs 控制参数个数
## nargs=2, 必须 2 个参数
## nargs='*', 0个或多个参数
## nargs='+', 1个或多个参数
## nargs='?', 0个或1个参数
parser.add_argument('--nums', nargs=3, type=int)
# 创建互斥组,-v和-q不能同时使用
group = parser.add_mutually_exclusive_group()
# action 定义参数行为
group.add_argument("-v", "--verbose", action="store_true")
group.add_argument("-q", "--quiet", action="store_true")
# 解析参数
# 返回的是一个 Namespace 对象
args = parser.parse_args()
# 使用命令参数
print(f"echo1: {args.echo1}, echo2: {args.echo2}")
print(f"sftp服务的IP为: {args.sftp_ip}, 端口号: {args.sftp_port}")
print(f"host is {args.host}")

argparse 会默认帮你生成 -h--help 选项,省去自己写帮助文档的功夫。需要留意的是,代码里注释部分已经把核心参数解释清楚了,实际使用时可以参照着快速搭建。

action参数

add_argument() 中的 action 参数用来定义参数行为。默认值是 store,意味着直接存储值。但更多场景下我们需要一些“特殊动作”,比如布尔开关、累加次数、追加列表等。下面逐个拆解。

  • action='store_true',常用于布尔开关,不传则为 False
parser.add_argument('--verbose', action='store_true')
# 运行 python app.py --verbose
# 解析后
args.verbose == True
  • action='store_false',反向布尔开关,不传则为 True
  • action='append',每出现一次就追加到列表
parser.add_argument('--tag', action='append')
# 使用
python app.py --tag a --tag b
# 得到
args.tag == ['a', 'b']
  • action='count',统计出现次数,常用于日志级别控制
parser.add_argument('-v', '--verbose', action='count', default=0)
# 使用
python app.py -vvv
# 得到
args.verbose == 3
  • action='version',打印版本后退出
parser.add_argument('--version', action='version', version='v1.0.0', default=0)
# 使用
python app.py --version
# 输出 v1.0.0
# 也可以写个函数来动态获取
def get_version() -> str:
    return "v1.0.0"
# help 不传的话默认为 show program's version number and exit
parser.add_argument(
    "--version",
    action="version",
    version=get_version(),
    # help="Show the version of the tool and exit.",
)
  • action='store_const',设置为指定常量值
parser.add_argument('--json', action='store_const', const='json', dest='format')
# 运行
python app.py --json
# 得到
args.format == 'json'

这些 action 组合起来,基本能覆盖 90% 的命令行参数需求。

互斥参数

有时候我们需要让某些参数“水火不容”,比如 --verbose--quiet 同时出现就没意义了。argparse 提供了互斥组来解决:group = parser.add_mutually_exclusive_group()

使用 group.add_argument 设置的参数将互斥,不能同时使用。如果强行同时传入,argparse 会直接报错。

一个典型例子:

import argparse
parser = argparse.ArgumentParser()
# 创建互斥组
# 传入 required=True 的话,用户必须从互斥组参数中选一个; 默认用户可以不选可选组参数
group = parser.add_mutually_exclusive_group()
group.add_argument('--verbose', action='store_true')
group.add_argument('--quiet', action='store_true')
args = parser.parse_args()
print(args)
# 这样同时调用会报错
python app.py --verbose --quiet

子命令

当命令行工具包含多种操作时,子命令就派上用场了。比如一个用户管理工具,可能有 adddeletelist 等子命令,每个子命令又有各自独立的参数。这时 parser.add_subparsers() 就是最佳选择。add_subparsers() 用来给一个命令行程序添加多个子解析器,每个子解析器对应一个子命令。

基本用法

import argparse
parser = argparse.ArgumentParser(prog='usercli', description='用户管理工具')
# required=True, 强制用户使用子命令
# 建议总是显式写 dest='command'
subparsers = parser.add_subparsers(dest='command', required=True)
# add 子命令
parser_add = subparsers.add_parser('add', help='添加用户')
parser_add.add_argument('username', help='用户名')
parser_add.add_argument('--age', type=int, default=18, help='年龄')
# delete 子命令
parser_delete = subparsers.add_parser('delete', help='删除用户')
parser_delete.add_argument('username', help='用户名')
# list 子命令
parser_list = subparsers.add_parser('list', help='列出用户')
parser_list.add_argument('--verbose', action='store_true', help='显示详细信息')
args = parser.parse_args()
if args.command == 'add':
    print(f'添加用户: {args.username}, 年龄: {args.age}')
elif args.command == 'delete':
    print(f'删除用户: {args.username}')
elif args.command == 'list':
    print(f'列出用户, verbose={args.verbose}')

子命令绑定处理函数

上面的 if/elif 结构在子命令少时还能用,但一旦命令多起来,代码维护起来就很痛苦。更优雅的做法是:为每个子命令绑定一个处理函数,然后用 set_defaults 把函数存到 func 属性里,最后统一调用 args.func(args)。这样职责清晰,扩展也方便。

import argparse
def handle_add(args):
    print(f'添加用户: {args.username}, 年龄: {args.age}')
def handle_delete(args):
    print(f'删除用户: {args.username}')
def handle_list(args):
    print(f'列出用户, verbose={args.verbose}')
def create_parser() -> argparse.ArgumentParser:
    parser = argparse.ArgumentParser(prog='usercli')
    subparsers = parser.add_subparsers(dest='command', required=True)
    parser_add = subparsers.add_parser('add', help='添加用户')
    parser_add.add_argument('username')
    parser_add.add_argument('--age', type=int, default=18)
    parser_add.set_defaults(func=handle_add)
    parser_delete = subparsers.add_parser('delete', help='删除用户')
    parser_delete.add_argument('username')
    parser_delete.set_defaults(func=handle_delete)
    parser_list = subparsers.add_parser('list', help='列出用户')
    parser_list.add_argument('--verbose', action='store_true')
    parser_list.set_defaults(func=handle_list)
    return parser
def main() -> None:
    parser = create_parser()
    args = parser.parse_args()
    # 如果用了 args.func(args)
    # 一定要确保每个子命令都执行了 parser_xxx.set_defaults(func=...)
    # 否则报错: AttributeError: 'Namespace' object has no attribute 'func'
    args.func(args)
if __name__ == "__main__":
    main()

子命令共享公共参数

不同子命令常常需要重复的参数,比如 --config 配置文件路径。这时候可以抽一个父解析器作为“模板”,通过 parents 参数继承到每个子命令中。注意父解析器要设置 add_help=False,避免帮助信息冲突。

import argparse
def main():
    common_parser = argparse.ArgumentParser(add_help=False)
    common_parser.add_argument('--config', help='配置文件路径')
    parser = argparse.ArgumentParser(prog='tool')
    subparsers = parser.add_subparsers(dest='command', required=True)
    parser_a = subparsers.add_parser('start', parents=[common_parser])
    parser_a.add_argument('--port', type=int)
    parser_b = subparsers.add_parser('stop', parents=[common_parser])
    parser_b.add_argument('--force', action='store_true')
    # 解析命令行参数
    # common_parser 是一个共享参数模板, 不需要参与参数解析
    args = parser.parse_args()
    if args.command == 'start':
        print(f"Starting with config: {args.config} on port: {args.port}")
    elif args.command == 'stop':
        print(f"Stopping with config: {args.config} {'forcefully' if args.force else ''}")
    else:
        print("Unknown command")
if __name__ == "__main__":
    main()

子命令设置别名

用户可能觉得 remove 太长,想用 rm。通过 aliases 参数可以轻松实现:

parser_remove = subparsers.add_parser('remove', aliases=['rm'])

之后两种命令都可以:

python tool.py remove file.txt
python tool.py rm file.txt

嵌套子命令

一些复杂工具会涉及多级命令,比如 tool user add alicetool user delete bob。这可以通过嵌套 add_subparsers() 来实现:

import argparse
parser = argparse.ArgumentParser(prog='tool')
subparsers = parser.add_subparsers(dest='entity', required=True)
user_parser = subparsers.add_parser('user')
user_subparsers = user_parser.add_subparsers(dest='action', required=True)
user_add = user_subparsers.add_parser('add')
user_add.add_argument('name')
user_delete = user_subparsers.add_parser('delete')
user_delete.add_argument('name')
args = parser.parse_args()
print(args)

运行 python tool.py user add alice,得到:

Namespace(entity='user', action='add', name='alice')

从基础用法到嵌套、别名、公共参数共享,argparse 的设计足够灵活,能应对从简单脚本到大型 CLI 工具的各种需求。记住一句话:先想清楚你的命令行交互模型,再用 argparse 去实现它,事半功倍。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 Python
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。