当前位置:

首页 > 编程开发 > 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

子命令

当命令行工具包含多种操作时,子命令就派上用场了。比如一个用户管理工具,可能有 add、delete、list 等子命令,每个子命令又有各自独立的参数。这时 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 alice、tool 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 去实现它,事半功倍。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发 Python
相关文章 更多
langgraph python guide中文入门教程详解
langgraph python guide中文入门教程详解

本篇LangGraph Python中文入门教程详解,系统梳理StateGraph状态机定义、节点编写、边与条件路由、检查点持久化(MemorySaver)等核心机制,提供从环境安装到完整循环智能体构建的代码示例与实操指导。

laravel创建项目步骤详解及命令教程
laravel创建项目步骤详解及命令教程

详解使用Composer与Laravel安装器创建Laravel项目的完整步骤、核心命令及环境配置,包含目录权限、环境文件与常见报错排查。

google adk install Python环境安装教程
google adk install Python环境安装教程

本教程详细介绍 Google ADK(Android Accessory Development Kit)在 Python 环境下的安装与配置方法,涵盖 Python 基础环境检查、虚拟环境搭建、依赖库与包安装、以及硬件通信权限排查。

PHP递归遍历目录文件:RecursiveDirectoryIterator与自定义实现
PHP递归遍历目录文件:RecursiveDirectoryIterator与自定义实现

深入解析在PHP中递归遍历多级目录文件的两种核心方案:基于SPL标准库的RecursiveDirectoryIterator高效流式迭代,与基于scandir/opendir的自定义递归函数实现,剖析执行机制、内存表现与实战避坑指南。

gradle安装步骤详解及环境变量配置教程
gradle安装步骤详解及环境变量配置教程

本文详细介绍Gradle的下载、解压、环境变量配置步骤以及安装验证方法,帮助开发者快速完成Gradle本地开发环境搭建。

shell脚本怎么执行命令并获取执行结果的方法
shell脚本怎么执行命令并获取执行结果的方法

详细讲解在Shell脚本中执行命令并获取执行结果的常用方法,涵盖标准输出捕获、退出状态码判断、错误流重定向、多行结果处理及常见避坑要点。

Java变量声明与初始化:局部、成员及静态变量的定义语法
Java变量声明与初始化:局部、成员及静态变量的定义语法

系统解析Java局部变量、成员变量与静态变量的定义语法、声明与初始化机制、生命周期及JVM内存驻留规则,结合图解与代码示例分析常见编译错误与认知误区。

windows claude code 安装
windows claude code 安装

详解如何在Windows 10/11上安装Claude Code。涵盖WSL与Git Bash终端选择、Node.js版本检查、npm全局安装步骤、身份验证流程及claude doctor诊断方法,帮助开发者快速搭建本地AI编码助手。

typescript是什么语言?一文看懂其定义与用途
typescript是什么语言?一文看懂其定义与用途

深入浅出解析TypeScript是什么语言。本文详细介绍TypeScript的语言定义、超集架构、核心运行原理、与JavaScript的核心对比以及四类典型工业级应用场景,帮助读者全面看懂TS的价值与用途。

codex安装windows教程桌面版完整安装步骤指南
codex安装windows教程桌面版完整安装步骤指南

详解如何在 Windows 电脑上通过 Microsoft Store 安装 Codex 桌面应用,包括启动登录、切换 Codex 模式、关联本地代码项目及终端环境配置的界面操作指引。

查看更多
精品专题 更多
装机必备
装机必备

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

Windows
Windows

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

PDF教程
PDF教程

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

Mac软件 更多
WPS Office macOS版
WPS Office macOS版
macOS

WPS Office是一款面向macOS用户的综合办公套件,将文字处理、电子表格、演示文稿、PDF工具、模板与云协作整合在同一应用中。它兼容常见Microsoft Office格式,支持Intel及Apple芯片Mac,基础功能可免费使用,

Shapr3D macOS版
Shapr3D macOS版
Mac

Shapr3D是一款面向工业设计、机械工程、建筑概念和三维打印工作流的CAD软件。Mac版采用Parasolid建模内核,支持草图约束、实体建模、工程图、可视化渲染及常见CAD格式交换,并可通过账户在多台设备之间同步项目。

REAPER macOS版
REAPER macOS版
Mac

REAPER是Cockos开发的数字音频工作站,提供多轨音频与MIDI录制、剪辑、处理、混音和母带制作工具。Mac版兼容Intel与Apple芯片,支持AU、VST、VST3、CLAP等插件格式,并提供高度可定制的工作流程。

WINDOWS 更多
Adobe Photoshop Windows版
Adobe Photoshop Windows版
Windows

Adobe Photoshop 是面向摄影师、设计师和内容创作者的专业图像处理工具,可在 Windows 上完成照片修饰、选区抠图、图层合成、文字排版、绘画及生成式编辑。软件采用订阅授权,由 Creative Cloud 管理安装、更新与许

Adobe InDesign Windows版
Adobe InDesign Windows版
Windows

Adobe InDesign 是面向印刷与数字出版的专业页面排版工具,可制作书籍、杂志、宣传册、海报、交互式 PDF 和电子书。它提供精细的文字样式、多页面管理、印前检查及多格式输出能力,并能与 Photoshop、Illustrator

Adobe Illustrator Windows版
Adobe Illustrator Windows版
Windows

Adobe Illustrator 是用于绘制矢量图形、插画、图标、徽标和版式的专业设计工具。它以路径和锚点为核心,作品放大后仍能保持清晰,并提供画板、文字、渐变、图像描摹及精确变换等功能,适合品牌视觉、印刷物料、数字界面和商业插画创作。