用 uv 打造可复用的跨平台 Python CLI 工具库实践
文章目录为什么选 uv而不是再手搓 venv目录与模块边界函数优先CLI 另放跨平台能统一就统一不能统一就拆文件项目根怎么找只认 pyproject.toml资源释放与中断退出即清空占用小结可复制的检查清单自己维护一堆零散脚本时最难受的往往不是「写不出来」而是依赖装乱、Win/macOS 行为不一致、业务逻辑和 argparse 缠在一起、跑完留下孤儿进程。本文以一套真实的跨平台 Python CLI 工具库mscc-cli为例整理可复用的工程约定。为什么选 uv而不是再手搓 venvmscc-cli 用pyproject.toml声明项目与依赖日常在仓库根执行uvsyncuv run ai/cli.py--prompt短任务uv run会按当前锁文件起隔离环境再跑脚本团队成员少争论「你本机 Python 是哪一版」。项目要求requires-python 3.13依赖写在[project].dependencies开发依赖放[dependency-groups].dev。核心可复用包如core用 hatchling 打进 wheel业务脚本直接from core...导入。要点uv run是快捷测试入口不是业务主路径。长文本、多行任务应走可 import 的函数避免 Windows 上命令行参数被截断。目录与模块边界函数优先CLI 另放约定可以压成一句话能力做成函数命令行只做薄壳。文件职责xxx.py/workflow.py可 import 的业务函数cli.py仅 argparse、校验、退出码再调用函数例如 Agent 入口业务用from ai.agent import run_agent人工试跑用uv run ai/cli.py--prompt用一句话总结本仓库多步编排同理workflow.py不含argparse、不含__main__cli.py不复制编排逻辑。其它脚本只调主入口不直接 import 某一平台实现文件。跨平台能统一就统一不能统一就拆文件跨平台优先pathlib、sys.platform子进程用参数列表禁止shellTrue。同一套代码拧不动时不要在一个文件里堆if win / else实现拆成*_win.py/*_mac.py必要时*_linux.py由workflow.py或主入口按平台选用cli.py不感知平台细节状态输出统一用[OK]/[SKIP]/[FAIL]/[ERROR]失败非零退出方便脚本串联与日志检索。项目根怎么找只认 pyproject.toml硬编码parent.parent、或拿.git/ 文档文件当根标记换目录就碎。mscc-cli 的做法是自脚本路径或 cwd 向上找第一个带pyproject.toml的目录即根defrepo_root(start:Path|NoneNone)-Path:here(startorPath.cwd()).resolve()ifhere.is_file():herehere.parentforcandidatein(here,*here.parents):if(candidate/pyproject.toml).is_file():returncandidatereturnPath.cwd().resolve()ensure_repo_path再把根目录插入sys.path保证任意子目录脚本都能稳定from core.logger import Logger。中间产物放build/日志用统一Logger写到logs/日期_run.log不要各脚本自建一套。资源释放与中断退出即清空占用浏览器、子进程、文件锁、HTTP session只要脚本进程要退出成功、失败、超时、CtrlC都必须收尾。实践上用with/try/finally禁止只在成功分支里closefinally里清理要防二次异常且幂等CtrlC 视为正常中止打印[SKIP] 已中断退出码130并杀掉本脚本拉起的子进程浏览器自动化统一走共用封装如core.browser.open_browser按--user-data隔离 profile退出关闭 context / Playwright避免残留 Chrome。小结可复制的检查清单依赖与运行交给 uv pyproject.toml业务函数可 importcli.py只做参数与退出码平台差异拆文件主入口统一调度根目录只认pyproject.toml产物进build/日志统一任何退出路径都释放占用按这几条搭工具库脚本会从「能跑」变成「能复用、能协作、能在三端稳定跑」。后续加新能力时先问自己别人能不能import调用uv run 模块/cli.py能不能一分钟验通答得上结构就对了。

相关新闻

vivo校招笔试经验:Java基础与操作系统高频考点全解析

vivo校招笔试经验:Java基础与操作系统高频考点全解析

2018年秋招那会儿,我刚从学校出来,投了一堆手机厂商的软件开发岗,vivo的笔试是让我印象比较深的一次。不是因为题目特别难,而是它的题型分布和考察思路很有代表性,基础题占大头,但每一道都在考“你到底有没…

2026/11/8 5:35:21 阅读更多 →
鸿蒙OS 应用配置文件详解:从 module.json5 到 app.json5 的完整实践

鸿蒙OS 应用配置文件详解:从 module.json5 到 app.json5 的完整实践

1. 引言在鸿蒙OS(HarmonyOS)应用开发中,配置文件是应用工程的“骨架”,它决定了应用如何被系统识别、如何申请权限、如何声明页面与组件。无论是初学者还是有一定经验的开发者,理解配置文件的结构与字段含义&#xff0…

2026/10/26 10:46:52 阅读更多 →
低成本机器人开发实战:从ROS2到Hugging Face生态

低成本机器人开发实战:从ROS2到Hugging Face生态

Hugging Face 推出一款 399 美元的 Microduck 机器人时,很多人的第一反应是“这个价钱能买到什么?”作为一家以模型和数据集闻名的人工智能公司,Hugging Face 进入机器人硬件领域,真正的看点其实不是那台机器人本身,而…

2026/10/30 19:32:59 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/11/8 1:19:03 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/11/7 12:08:40 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/11/8 1:35:05 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/11/8 1:38:41 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/11/7 12:08:40 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/11/8 1:23:14 阅读更多 →

日新闻

周新闻

月新闻