惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
L
LangChain Blog
Vercel News
Vercel News
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
T
Threatpost
Scott Helme
Scott Helme
T
Tailwind CSS Blog
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
The Register - Security
The Register - Security
罗磊的独立博客
P
Proofpoint News Feed
腾讯CDC
S
Schneier on Security
雷峰网
雷峰网
A
About on SuperTechFans
T
Tenable Blog
F
Full Disclosure
Cyberwarzone
Cyberwarzone
博客园_首页
有赞技术团队
有赞技术团队
K
Kaspersky official blog

博客园_首页

[开源] 全屏时钟 / Full Clock:放弃 time.is,用 Svelte 5 写了一个极致纯净的全屏时钟,解决秒数焦虑 三、Linux 文件管理+用户管理 XGBoost + SHAP 一键生成 10 张出版级模型解释图 【Azure App Service】App Service 里的 SNAT 端口 vs 出站连接数:到底是谁限制了谁? 2026御网杯线上挑战赛Pwn的wp WEB-2026DASCTF夏季赛-CorpGate 为什么你用光模块测试FPGA IBERT不通 面试官:Workflow 和 Agent 有什么区别?如何选型? 从失忆到记住一切:Spring AI AutoMemoryTools 与 Session API 实战 2026 年 5 个最佳 Agent Skills 平台推荐 15天学会AI应用开发(三)把历史对话作为提示词会怎样 如何在Reaonix中使用CodeGraph以及CodeGraph效果实测经验分享 架构师必备:分布式事务方案选型 Agent的诞生(二):让模型开始调用工具 OpenDeepWiki 导出仓库 Skill:把代码知识沉淀成企业可复用的 AI 资产 [python]argparse 包在聊天机器人中的应用 LazyVim安装snacks.nvim报错“Process was killed because it reached the timeout” 一、红帽RHCSA+RHCE课前说明与Linux系统安装学习笔记 洛谷-P11240 [KTSC 2024 R2] 回文判定 题解 告别深夜夺命Call:如何利用 AI Agent Skills 自动自愈生产环境故障 从机器翻译到智驾:规则派的黄昏与数据革命的终局 Google 开源了啥,让 AI Agent 碰数据库不再是定时炸弹 P3550 [POI 2013] TAK-Taxis FastAPI 【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (4)--- 架构 - 罗西的思考 CentOS服务器上搭建Jenkins+maven+GitLab k8s gateway agentgo 运行时架构深度解析:一个 Go AI 编程助手的核心引擎设计 免费可商用 PHP 管理后台 CatchAdmin V5.3.1 发布 后台打包直降 5s 内 PPO算法 基础讲解 从 Agent 到代码:Claude Code 编排模型的演进 15天学会AI应用开发(二)为什么编写提示词这么重要 记一次GIS专业职称水平能力测试考试 在CubeMX生成项目中,手动移植FreeRTOS Kernel V11.3.0 LTS,HardFault 启动崩溃问题日志 [MAF的Agent管道详解-05]对话历史的持久化和输入输出的增强 从跑通到放弃:我的 Cloud Agent V1开发历程 Avalonia 制作复杂布局动画 Claude Code + 通义千问,从零搭出生产级 RAG 要花多少钱? Flutter 复杂拖拽排序实战:同源排序 + 跨容器拖拽完整落地 语言开发笔记3 Keepalived 学习总结 企智栾生 ETA (企智孪生(ETA)vs 传统数字孪生:有本质区别)【浙江联保网络 卢伟舜】 [数学-导数隐零点] 看起来简单?求过定点 (0, √e) 的直线与 y=e^x 交点横坐标差最小时的斜率 深度学习进阶(二十五)RoPE:现代 NLP 的位置编码范式 GMSL + 硬件PTP方案,真能让ADAS路测告别“数十毫秒偏差”吗? 【学习笔记】《Python编程 从入门到实践》第4章:for循环、range()、切片与元组 AI Agent 框架接金融行情数据前,先检查这 7 个工程风险 Dify — Workflow - 数据可视化 高性能服务器的基石:从并发模型到状态机 我用了 8 个月 Codex CLI,总结出这套 AI 编程工作流 重建 AI 认知第 3 篇:Prompt Engineering——怎么让 AI 听懂你的话 使用typedef封装函数指针新类型 只有踩过坑才懂:前端生成唯一 ID,别用 Date.now ()了!试试它crypto.randomUUID() ClickHouse Kubernetes集群部署与维护文档 c#一行代码免写登录页:PicoServer 的 AddBasicAuth 中间件实战 南京办公室装修避坑|21 年只做公装,闭口合同零增项 共绩科技:跨云弹性推理场景下,模型分发如何跟上算力调度 薄雾之上的上界:高概率复杂度的分析 TopBeeAI基金申请助手:使用AI提升基金申请效率的实践指南 高管的 AI 精神病 【译】构建前先计划:带你了解 Visual Studio 中的 Plan Agent 一行代码干翻 Java 反射?EggG 流式反射调用让反射优雅到不可思议 RAG 负责召回,LLM Wiki 负责沉淀:团队知识系统为什么不能只做检索 做一款企业真正敢用的AI测试应用,到底有多难?究竟难在哪? JaVers 版本历史功能完整实现指南 Github Project-AI Agentic Framework (.NET) [MAF的Agent管道详解-04]如何让LLM按照要求的结构输出数据? 随机过程WebApp实验室:从随机动力学到 AI 洞察的概率世界 有关使用python爬虫的一些心得 前端视角下的 C# 《GIS基础原理与技术实践》配套案例(Python版) GoF设计模式——代理模式 上位机程序集的反编译与加壳保护 基于 Blazor 实现的电梯运行监测系统 - known 【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (3)--- 总体思考 用 ESP32 做了一个 AI Agent 桌面状态核心,科技感直接拉满 马能否走遍棋盘的可达性证明 PortSwigger SQL注入LAB10 从 Harness Engineering 到 Trellis:AI 编程助手的工程化落地实践 信息化运维项目费用测算全指南:政策边界、三大方法与实操要点 Claude Code 实战 400 万 Tokens:接入 DeepSeek V4,从$26降到$2 Docker--容器常用命令 Dify — Chatflow - 数据库 零基础认识大语言模型工作原理 不繁花 写页面时别再把 Element Plus 整个搬进来啦!Vue3按需加载的坑我帮你踩平了 一条命令让你这辈子彻底解决"LF will be replaced by CRLF"(建议收藏) Miller Rabin:概率之下,证据成群 - Ofnoname Nessus 2026.5.9 更新升级:企业级漏扫工具的全能进阶与实战应用 Agent Harness 架构真相:Prompt Cache 如何决定 Skill、MCP 与 SubAgent 设计 Claude Code 支持 LSP 指南(C#/JAVA等) [翻译] 为什么我要用 C# 构建数据库引擎 DeepSeek V4 + Claude Code thinking mode 400 错误修复方案 云原生 CI/CD 平台架构设计 模板方法模式实战:重构Agent工具审批,告别重复代码 Ubuntu修改主机名操作指南 [MAF的Agent管道详解-03]连接LLM的IChatClient对象 《HelloGitHub》第 122 期 AI Agent 到底是做什么的?优势在哪里? 完整学习LLM(六):上下文窗口是什么,为什么模型会忘东西
[Python]标准库argparse解析命令行参数使用介绍
花酒锄作田 · 2026-05-31 · via 博客园_首页

前言

argparse 是python标准库中用于解析命令行参数的模块。

基本使用

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
# metavar 修改帮助信息中显示的占位名
parser.add_argument("--sftp_port", metavar="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', 反向布尔开关
  • 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'

互斥参数

创建互斥组:group = parser.add_mutually_exclusive_group()

使用group.add_argument设置的命令行选项将互斥,不能同时使用

简单例子:

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

子命令

当命令行工具包含多种操作时可能就会需要子命令了,例如:

python tool.py add user1
python tool.py delete user1
python tool.py list

这里add, delete, list 都是子命令, 这时候最适合用 parser.add_subparsers()

add_subparsers() 用来给一个命令行程序添加多个子解析器(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 来分发逻辑,简单场景下还凑合,但是当命令多,功能复杂时,代码会显得非常混乱,这种情况下就可以为子命令绑定处理函数。

示例代码:

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()

子命令共享公共参数

如果多个子命令都需要同一组参数,可以抽一个“父解析器”。

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()

子命令设置别名

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

这样两种命令都可以

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

嵌套子命令

复杂 CLI 可能有多级命令,比如:

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')