MoreRSS

site iconPython猫修改

运营「Python 潮流周刊」。Python编程、生活随笔、个人作品。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

Python猫的 RSS 预览

Python 潮流周刊#104:Python 考虑添加虚拟线程啦?

2025-05-31 08:00:00

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。

温馨提示: 在微信关注 Python猫,发送“优惠券”,即可领取 9 折优惠码,订阅专栏可享 15 元优惠。

分享了 12 篇文章,12 个开源项目,2 则音视频,2 则热门讨论

以下是本期摘要:

🦄文章&教程

① Pyrefly vs. ty:比较 Python 新的两个类型检查器

② 单进程多解释器,无 GIL 争用-Python 3.12 之前

③ 为什么在 2025 年我们仍用第三方应用来写 Django REST API?

④ 介绍 Pyrefly:Rust 开发的新型 Python 类型检查器

⑤ Pandas 将放弃 NumPy,转向更快的 PyArrow

⑥ Python 微型智能体:70 行代码实现基于 MCP 协议的智能体

⑦ Narwhals:统一 pandas、Polars 和 PySpark 的 DataFrame 函数

⑧ DumPy:让你不用思考的 NumPy

⑨ 超越查询优化:使用 SQLAlchemy 和 RDSProxy 的 Aurora Postgres 连接池

⑩ 验证新项目的有效方法

⑪ 注意力并非我们所需的全部

⑫ 那些改变了我对编程语言认知的文章

🐿️项目&资源

① agenticSeek:完全本地化的 AI 智能助手

② django-allauth:Django 认证和账户管理套件

③ Ghost-Downloader-3:跨平台 AI 增强多线程下载器

④ vectorvfs: 文件系统作为向量数据库

⑤ LivePortrait: 高效的肖像动画生成

⑥ pgmpy:贝叶斯网络因果概率建模库

⑦ MaiBot:群组聊天的赛博网友

⑧ magentic-ui: 以人为中心的网页智能体

⑨ vibe-draw:手绘草图转 3D 建模

⑩ airweave:让智能体能搜索任意应用

⑪ flowshow:Python 任务流程可视化工具

⑫ ai-baby-monitor:将视频大模型变为婴儿保姆

🐢播客&视频

① PyCon US 2025 的视频列表

② PyTexas 2025 视频列表

🥂讨论&问题

① 为 Python 添加虚拟线程

② CPython 裁员教会了我专业技能的真正价值是什么

周刊实行付费订阅制,年费 148 元,平均每天 4 毛钱,绝对是一笔有眼光的投资。花钱学习知识,花钱提升自己,欢迎订阅这个你绝对不会后悔的专栏:https://xiaobot.net/p/python_weekly

订阅后,可免费查看 第 104 期周刊的全文:https://www.xiaobot.net/post/6ac75b38-177c-4596-b8a0-855749ef7df5

Python 潮流周刊第3季总结,附电子书下载

Python 潮流周刊第二季完结(31~60)

Python 潮流周刊第一季精华合集(1~30)

微信关注 Python猫https://img.pythoncat.top/python_cat.jpg

Python 潮流周刊#103:LlamaIndex 的单体代码库改造

2025-05-24 08:00:00

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。

分享了 12 篇文章,13 个开源项目,2 则音视频

温馨提示: 在微信关注 Python猫,发送“优惠券”,即可领取 9 折优惠码,订阅专栏可享 15 元优惠。

以下是本期摘要:

🦄文章&教程

① Python 大规模工具链管理:LlamaIndex 的单体代码库改造

② Setuptools 最近的破坏性升级

③ OpenAI Response API 的新工具和功能

④ cProfile 与 pstats 快速做 Python 性能分析

⑤ Python PEP 的起源

⑥ Django 项目是如何做决策的?

⑦ PEP-791:imath — 针对整数的特定数学函数模块

⑧ 从 JSON 中加载 Pydantic 模型且不耗尽内存

⑨ 快被遗忘的项目在发布 12 年后出了 1.0.0 版本

⑩ 使用 Bash 高效复制整个 PyPI 仓库

⑪ 从头开始实现一个简单的搜索引擎

⑫ 应对复杂系统:我在谷歌工作时学到的经验

🐿️项目&资源

① Index-anisora:B站开源的动漫视频生成模型

② DeepResearchAgent:深度研究智能体

③ workflow-use:创建和运行工作流(RPA 2.0)

④ tchMaterial-parser:国家中小学智慧教育平台电子课本下载工具

⑤ mistletoe:纯 Python 的极速 Markdown 解析器

⑥ PurpleLlama:大模型安全工具集

⑦ PPTAgent:自动生成与评测 PPT 的智能体

⑧ buckaroo:Jupyter 数据表格神器

⑨ agent-squad:多智能体编排框架

⑩ juvio:Jupyter 的 UV 内核

⑪ NLWeb:自然语言 Web 接口协议

⑫ pyftpdlib:高速且可扩展的 Python FTP 服务器库

⑬ 代码之道:永恒的 Vibe Coding 艺术

🐢播客&视频

① ty: Astral 的新类型检查器

② 216.独立开发者的黄金时代 - 乱翻书

周刊实行付费订阅制,年费 148 元,平均每天 4 毛钱,绝对是一笔有眼光的投资。花钱学习知识,花钱提升自己,欢迎订阅这个你绝对不会后悔的专栏:https://xiaobot.net/p/python_weekly

订阅后,可免费查看 第 103 期周刊的全文:https://www.xiaobot.net/post/65379f93-914a-4034-af03-aafc9d453a0d

Python 潮流周刊第 2 季完结了,分享几项总结:https://pythoncat.top/posts/2024-07-14-iweekly

周刊前30期的免费合集,含精美电子书(EPUB/PDF):https://pythoncat.top/posts/2023-12-11-weekly

万字浓缩版,Python 潮流周刊第 1 季的 800 个链接!:https://xiaobot.net/post/78c3d645-86fa-4bd8-8eac-46fb192a339e

微信关注 Python猫https://img.pythoncat.top/python_cat.jpg

Python 潮流周刊#102:微软裁员 Faster CPython 团队

2025-05-17 08:00:00

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。

分享了 12 篇文章,12 个开源项目,2 则音视频,3 则热门话题

以下是本期摘要:

🦄文章&教程

① 自由线程 Python 的第一年回顾

② 编译后 Python 代码性能与能耗的实证研究

③ 揭开 t-string 的奥秘

④ 我不喜欢 NumPy

⑤ Typerdrive:高效开发与 API 通信的 Typer 应用

⑥ 升级 Django 5 后,数据库主键冲突之谜

⑦ Python 性能监控的关键技术

⑧ 像专业工程师一样构建 Python 项目

⑨ 用 Python 分析 X 公司新的 logo

⑩ 将 Python 代码迁移到单体仓库的经验分享

⑪ FastAPI 日志链路追踪:从原理到实现

⑫ Cursor 如何快速索引代码库?

🐿️项目&资源

① deer-flow:字节开源的深度研究框架

② codeflash:用 AI 自动优化代码

③ Scrapling:让网页爬取变得简单高效

④ openpilot:开源自动驾驶操作系统

⑤ bracket:自托管的赛事管理系统

⑥ OpenManus:开源多智能体自主任务系统

⑦ asyncmq:超快的异步任务队列

⑧ ZeroSearch:无需搜索即可增强大模型的搜索能力

⑨ system_prompts_leaks:大模型系统提示词泄露集合

⑩ wtfis:人性化的域名和 IP 查询工具

⑪ FlexGet:多功能的内容自动化工具

⑫ TUIFIManager:跨平台的终端文件管理器

🐢播客&视频

① 【PyCon】Faster CPython团队,没了!

② Python 3.14 Beta 特性冻结

🥂讨论&问题

① Microsoft 裁员 Faster CPython 团队,包括技术负责人 Mark Shannon

② 除了 Cython 和 Pyarmor, Python 还能如何保护源代码?

③ 大厂的同事们,你们是怎么定位线上故障的?

周刊实行付费订阅制,年费 148 元,平均每天 4 毛钱,绝对是一笔有眼光的投资。花钱学习知识,花钱提升自己,欢迎订阅这个你绝对不会后悔的专栏:https://xiaobot.net/p/python_weekly

订阅后,可免费查看 第 102 期周刊的全文:https://www.xiaobot.net/post/9ca65a3a-1620-4e42-ab9f-9433c29ec73f

Python 潮流周刊第 2 季完结了,分享几项总结:https://pythoncat.top/posts/2024-07-14-iweekly

周刊前30期的免费合集,含精美电子书(EPUB/PDF):https://pythoncat.top/posts/2023-12-11-weekly

万字浓缩版,Python 潮流周刊第 1 季的 800 个链接!:https://xiaobot.net/post/78c3d645-86fa-4bd8-8eac-46fb192a339e

微信关注 Python猫https://img.pythoncat.top/python_cat.jpg

Python 潮流周刊#101:Rust 开发的 Python 类型检查工具

2025-05-10 08:00:00

本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景:帮助所有读者精进 Python 技术,并增长职业和副业的收入。

分享了 12 篇文章,12 个开源项目

以下是本期摘要:

🦄文章&教程

① Python 3.14 新特性盘点,更新了些什么?

② Python π(3.14)

③ 再见 PyCon APAC,开启 PAO 新篇章

④ 让 AI 做语义单元测试

⑤ 解密 Asyncio:从零开始手搓一个

⑥ Python 依赖管理的新进展:PEP 751 锁文件标准

⑦ 用温度参数调整随机权重

⑧ 使用 MCP 和 Amazon Q 开发新闻智能体

⑨ Python 任务队列的扩展指南

⑩ pip 25.1 发布,支持依赖组管理

⑪ Django 模板语言的小怪癖

⑫ Python 代码质量工具大全

🐿️项目&资源

① ty:Rust 开发的 Python 类型检查工具

② WeClone:用微信聊天记录创造数字分身

③ AI-Media2Doc:将音/视频转化为小红书/公众号/知识笔记/思维导图

④ blast:AI 浏览 Web 的高性能服务引擎

⑤ contextgem:LLM 提取文档的结构化数据

⑥ Fluent-M3U8:PySide6 开发的跨平台 m3u8/mpd 下载器

⑦ Python-UIAutomation-for-Windows: Windows 平台的 Python UI 自动化库

⑧ video-subtitle-extractor:提取视频硬字幕,生成srt文件

⑨ epub-utils:EPUB 文件解析与元数据提取

⑩ novelWriter:纯文本小说写作编辑器

⑪ asciimatics:跨平台文本界面与 ASCII 动画开发库

⑫ 谷歌的提示词工程白皮书

周刊实行付费订阅制,年费 148 元,平均每天不到 4 毛钱,但绝对是一笔有眼光的投资。花钱学习知识,花钱提升自己,欢迎订阅这个你绝对不会后悔的专栏:https://xiaobot.net/p/python_weekly

订阅后,可免费查看 第 101 期周刊的全文:https://www.xiaobot.net/post/8e8f2642-3f93-4568-93d3-abe9b215d10b

Python 潮流周刊第 2 季完结了,分享几项总结:https://pythoncat.top/posts/2024-07-14-iweekly

周刊前30期的免费合集,含精美电子书(EPUB/PDF):https://pythoncat.top/posts/2023-12-11-weekly

万字浓缩版,Python 潮流周刊第 1 季的 800 个链接!:https://xiaobot.net/post/78c3d645-86fa-4bd8-8eac-46fb192a339e

微信关注 Python猫https://img.pythoncat.top/python_cat.jpg

Python 3.14 新特性盘点,更新了些什么?

2025-05-08 08:00:00

Python 3.14.0 稳定版将于 2025 年 10 月正式发布,目前已进入 beta 测试阶段。这意味着在往后的几个月里,3.14 的新功能已冻结,不再合入新功能(除了修复问题和完善文档)。

3.14 正好是圈周率 π 的前几位,所以我们将要迎来的其实是一个“圆满”的版本😂

本文想梳理这个版本中一些值得关注的新特性,让我们先睹为快吧~

重点更新

1. 类型提示惰性求值 (PEP 649)

Python 3.14 对类型提示机制做了根本性改进。从这个版本开始,函数、类和模块上的类型提示不再立即计算,而是先存储起来,等真正需要时才进行求值。

这个特性解决了大型项目中一个老大难问题:大量类型提示导致的启动缓慢。对企业级应用和大型项目来说,这简直就是一个福音!

这个改进带来了几个实实在在的好处:

  • 项目启动速度大幅提升,尤其是大型代码仓
  • 引用未定义类型时不再需要加引号,代码更加简洁
  • 新增的 annotationlib 模块提供了灵活的类型提示检查方式

下面的示例直观展示了这个特性带来的好处:

# Python 3.14 - 不再需要引号,即使类型未定义
>>> from annotationlib import get_annotations, Format
>>> def new_way(arg: Undefined):  # 直接使用未定义类型
...     pass

# Python 3.13 及之前版本需要这样写
>>> def old_way(arg: "Undefined"):  # 必须加引号,否则报错
...     pass

# 可以用不同格式查看类型提示
>>> get_annotations(new_way, format=Format.STRING)  # 字符串形式
{'arg': 'Undefined'}
>>> get_annotations(new_way, format=Format.FORWARDREF)  # 前向引用对象形式
{'arg': ForwardRef('Undefined', owner=<function new_way at 0x...>)}

这项改进让 Python 的类型系统变得更加好用,尤其是在使用类型检查工具时确实很有帮助。

2. 基于尾调用的新解释器

Python 3.14 的 CPython 引入了新的解释器实现。不同于之前用大块 switch-case 的传统做法,新解释器用小型 C 函数之间的尾调用来处理字节码。

这种新的架构设计体现了 Python 团队对性能持续优化的决心,虽然效果可能没一开始宣传的那么震撼。

关于性能数据,这里有个有趣的小插曲:

  • 这个特性最早被官宣时,声称有 9-15% 的性能提升
  • 但后来发现数据受到了 LLVM/Clang 19 编译器一个回归问题的影响
  • 经过更严格的测试,实际数据显示:在标准 pyperformance 测试中,平均提升仅有 3-5%
  • 不过在特定的字节码密集型计算中,性能提升仍然可以达到 30%

这项改进的真正价值可能不在当下。从长远来看,这很可能是 Python 解释器架构的一次重要转型,为未来更大幅度的性能提升打下基础。

目前这个解释器只支持 Clang 19 及以上版本编译器,而且只能在 x86-64 和 AArch64 架构上跑。不过官方表示未来 GCC 也会支持。要使用这个功能,需要在编译 Python 时手动指定 --with-tail-call-interp 参数。1

3. 无侵入调试接口 (PEP 768)

Python 3.14 新增的安全外部调试接口是个很给力的新功能,大大改善了 Python 程序的调试体验。以后不用预先在代码中插入任何调试语句,也能连上已经运行中的 Python 进程。

使用起来很简单:

python -m pdb -p 1234  # 直接连接到PID为1234的Python进程

实现这个功能的技术原理很巧妙:

  1. CPython 把关键内部结构的偏移量保存在 _Py_DebugOffsets 中,调试工具可以直接访问
  2. PyThreadState 中新加了外部调试支持结构,可以注入调试脚本
  3. 通过 sys.remote_exec() 功能可以检查和控制运行中的进程

这个特性不仅改善了开发者的调试体验,还为专业调试工具(如 pyspy、py-spy 等)提供了标准接口。这些工具以前必须为每个 Python 版本单独维护内存结构偏移量,现在不用这么麻烦了。生产环境下排查问题的难度也大大降低!

附:Python 3.14 调试特性的深度解读

4. 模板字符串 (PEP 750)

Python 3.14 新增了一种特别的字符串写法——模板字符串(t-string)。就像常用的 f-string 前面加 f 一样,这种新字符串前面加 t

它主要解决了 Web 开发中的安全需求。在用 Django、Flask 这类框架开发网站时,如何安全地处理 HTML 内容和 SQL 语句一直是个老大难问题。这个新的 t-string 语法就是为了解决这个问题,它兼顾了代码的简洁性和内容的安全性。

简单的例子:

from string.templatelib import Template

name = "World"
template = t"Hello {name}"  # 返回一个 Template 对象,而不是字符串

t-string 与 f-string 最大的区别在于:f-string 会直接计算并返回字符串,而 t-string 生成的是 Template 类型的对象。有了这个对象,我们就能对模板内容做各种安全处理,比如 HTML 转义和 SQL 注入防护:

from string.templatelib import Template, html

# 有恶意代码
evil = "<script>alert('evil')</script>"

# 用模板处理,防止 XSS 攻击
template = t"<p>{evil}</p>"

# 使用 html() 函数转义危险字符
html_safe = html(template) 
assert html_safe == "<p>&lt;script&gt;alert('evil')&lt;/script&gt;</p>"

这个新功能会让 Web 开发、日志记录、数据库操作等场景更加安全和方便。

附:Python 3.14 t-string 的全面解析与使用教程

其它重要更新

1. 支持 Zstandard 压缩格式 (PEP 784)

Python 3.14 标准库新增了 compression.zstd 模块,正式把 Zstandard 压缩格式纳入标准支持。这种由 Meta 公司开发的格式既压得小又压得快,甚至超过很多老牌压缩算法,非常适合处理大数据和网络通信场景。

随之一起更新的还有 tarfilezipfileshutil 模块,现在都能直接处理 Zstandard 压缩包了。而原有的 lzmabz2 等压缩模块也被整合到新的 compression 包下,统一了访问方式。

2. 用于 C 扩展的 Python 配置 API (PEP 741)

Python 3.14 新加了 C 语言的配置 API,写 C 扩展时操作 Python 配置变得简单多了。用这个 API 提供的函数,我们可以很方便地查询或改变 Python 的运行时配置。

比如,以前写 C 扩展必须深入了解 CPython 内部构造,现在只需用几行简单代码就能操作内存分配器、日志设置等:

// 看看调试模式是否开启
int debug_enabled = _PyConfig_GetBool(config, "debug");

// 指定模块搜索路径
_PyConfig_SetString(config, "pythonpath", "/custom/path");

博客原文

3. 实验性 JIT 编译器 (PEP 744)

Python 3.14 正式在官方 macOS 和 Windows 二进制版本中加入了实验性的即时编译器(JIT)。不推荐用于生产环境,仅供测试和尝鲜。

启用方式简单,只需设置环境变量:

# 设置环境变量开启 JIT
PYTHON_JIT=1 python3.14 your_script.py

可以通过 sys._jit 模块检查 JIT 状态:

import sys

if hasattr(sys, "_jit"):
    print(f"JIT状态: {"启用" if sys._jit.is_enabled() else "未启用"}")
else:
    print("JIT不支持")

4. REPL 语法高亮

Python 3.14 的交互式环境(REPL)正式支持语法高亮,大大提升了开发体验。这个功能默认开启,除非你设置了 PYTHON_BASIC_REPL 环境变量。

默认主题使用标准的 ANSI 颜色代码,确保兼容性的同时提供了清晰的视觉区分度,另外也支持自定义颜色主题。

这一改进让原生 Python 接近了 IPython 和 Jupyter 等现代工具的用户体验,也表明官方在重视开发者日常使用的小细节。

5. 放弃 PGP 签名 (PEP 761)

Python 3.14 版本将告别 PGP 签名,改用更现代的签名和验证方式来发布官方软件包。这一改变其实是 Python 跟上了开源软件分发领域的潮流,和当下大多数主流项目的做法一致。

6. finally 块中不能再用跳转语句 (PEP 765)

Python 3.14 增加了一项新限制:不能在 finally 块里用 returnbreakcontinue 跳出去。这种写法以后会被视为语法错误。

这个限制有很实在的目的,因为 finally 中的跳转语句通常会导致代码难懂、难维护,容易把异常情况给吞掉,造成莫名其妙的问题。

# Python 3.13 允许这种危险写法,但异常会被吞
try:
    raise ValueError("重要错误")
except Exception as e:
    print(f"捕获到错误: {e}")
    raise
finally:
    # 这里写 return 会打断异常传递,调用方看不到原始错误
    return "似乎一切正常"

# Python 3.14 中,上述代码将在语法层面被禁止

7. 捕获多个异常时不用加括号了 (PEP 758)

Python 3.14 简化了异常处理的写法。以前想同时捕获多种异常类型必须加括号,而在 3.14 版本中可以直接用逗号分隔:

try:
    operation()
except ValueError, TypeError:  # 可以用逗号分隔多个异常类型
    print("处理值错误或类型错误")

# 对异常组也适用同样的语法
try:
    operation()
except* ValueError, TypeError:  # 异常组也可以用逗号分隔
    print("处理值错误或类型错误")

这种写法不仅更简洁,也将更符合直觉。

不兼容变更

Python 3.14 带来了一些重要的不兼容变更,升级时需要特别注意:

  1. 除了 macOS 和 Windows 外,其它平台上 multiprocessingProcessPoolExecutor 的默认启动方式从 fork 改成了 forkserver。这能避免一些多线程的问题,但可能要修改依赖于旧行为的代码。

  2. CPython 解释器优化了引用计数机制,去掉了一些不必要的计数更新,所以 sys.getrefcount()Py_REFCNT() 返回的数字可能和以前不一样了。

  3. PEP 738 修改了 async/await 关键字的解析规则,一些极端情况下可能造成不兼容。

  4. distutils 模块在 3.12 中已经被强烈警告,3.14 版本会完全移除。如果还在使用,应该迁移到 setuptoolssysconfig

  5. imp 模块所有标记为弃用的函数已经删除,应改用 importlib

  6. asyncio 模块中的一些废弃函数如 @coroutine 装饰器已被移除,应该用 async/await 语法替代。

  7. XML 模块默认开启了更严格的安全限制,可能会导致原有较宽松的解析器设置失效。

  8. SSL/TLS 模块默认禁用了某些过时的加密算法和协议版本,对于需要与旧系统通信的应用可能要额外配置。

总结

这个带着圆周率数字的 Python 3.14 版本,给我们带来了全方位的升级。

在性能上,类型提示的惰性求值和全新的尾调用解释器大幅减轻了启动负担,而实验性的 JIT 编译器则在特定场景下展现了可观的速度提升。

在开发体验上,无侵入调试接口的加入和 REPL 的语法高亮功能使日常编程变得更加舒心逸意。

模板字符串和 Zstandard 压缩的加入则扩展了 Python 在 Web 开发和数据处理领域的应用空间。

除了功能增强,3.14 也带来了一系列语法优化,如异常捕获时不再需要括号以及 finally 块中禁用跳转语句等。这些简化和限制看似微小,却能减少代码中的隐藏 bug。同时,这个版本还作出了一些前瞻性的决定,如放弃 PGP 签名和改用 forkserver 作为默认启动方式。

总的来说,这个圆周率版本在性能、开发体验和语言功能上都有实质性的改进。不管是类型提示、解释器改进还是模板字符串,都展示了 Python 在各个领域的持续发力和进步。

参考资料

What's new in Python 3.14

Python 3.14 新特性解析

uv:统一的 Python 包管理

2025-05-05 08:00:00

花下猫语:uv 项目自发布起就大受欢迎,目前 Github star 52.6 K,远超过它的同类竞品们。前不久,它的创始人在 X 上披露了一组惊人的数据:uv 曾占据了 PyPI 超过 20% 的流量,用户每天通过它发起约 4-5 亿次下载请求!

我在去年翻译过 uv 首发时的新闻文章,根据博客后台不完整的统计,从 Google 搜索进入的访问量已经超过 3000,妥妥成为了我博客的搜索访问 TOP 1!这侧面也反映出 uv 的火爆程度!

uv 刚过一周岁不久,如此年轻,成绩斐然啊。趁着这波热点(实际是假期有时间),我抽空把 uv 重要版本更新的文章也翻译出来了,enjoy reading~


作者:@charliermarsh

译者:豌豆花下猫@Python猫

英文:uv: Unified Python packaging (https://astral.sh/blog/uv-unified-python-packaging)

声明:本翻译是出于交流学习的目的,为便于阅读,部分内容略有改动。转载请保留作者信息。

简述: uv 是一个用 Rust 开发的超高性能 Python 包管理器。

我们最初在 2 月份发布了 uv,作为常见 pip 工作流的即插即用替代方案。(译注:uv 在 2024.02 发布,本文写于 2024.08,翻译于 2025.05)

今天,我们发布一系列新功能,这些功能将 uv 从一个 pip 替代品扩展成为一个端到端的解决方案,可用于管理 Python 项目、命令行工具、单文件脚本,甚至 Python 本身。

它就像是 Python 世界的Cargo:提供了一个快速、可靠且易用的统一接口。


在 Astral,我们致力于为 Python 生态系统打造高性能的开发工具。我们最知名的产品是 Ruff,一个超高速的 Python 代码检查器格式化工具

在 2 月份,我们发布了 uv,这是一个极快的 Python 包安装器和依赖解析器,最初设计为常见 pip 工作流的即插即用替代方案。

今天,我们宣布 uv 自首次发布以来最大规模的功能扩展:

  • 端到端项目管理uv runuv lockuv sync。uv 现在能基于标准元数据创建跨平台的锁文件,并利用该文件来安装依赖。它是 Poetry、PDM 和 Rye 等工具的高性能替代品。
  • 工具管理uv tool installuv tool run (别名为 uvx)。uv 能在隔离的虚拟环境中安装命令行工具,还能无需先安装就直接执行命令(如 uvx ruff check)。它是 pipx 等工具的高性能替代品。
  • Python 安装uv python install。uv 现在可以直接帮你安装 Python,替代 pyenv 等工具。
  • 脚本执行:uv 现在可以管理基于 PEP 723 标准的单文件 Python 脚本,这些脚本内部包含依赖元数据。只需要一个简单的 uv run 命令就能执行这些独立的 Python 脚本。

...所有功能背后都是一个跨平台的超高速依赖解析器在支撑。

上图展示了启用所有可选依赖项时解析 Transformers 项目的速度对比:上方无缓存状态,下方启用了缓存。

并且所有功能都包含在新的、全面的文档中。

这些新功能每一项都大大扩展了 uv 的能力范围。但更独特的是,它们组合起来形成了一个完整的工具链,大大简化了 Python 开发过程。

结合 uv pip(我们将它作为一等功能,继续维护并改进),uv 适用于任何 Python 工作流,从一次性脚本到大型的多包工作区开发。

你可以通过我们的独立安装程序或从 PyPI 安装 uv:

curl

curl -LsSf https://astral.sh/uv/install.sh | sh

win

powershell -c "irm https://astral.sh/uv/install.ps1 | iex"

pip

pip install uv

pipx

pipx install uv

项目

uv 现在可以全面管理 Python 项目了。如果你用过 PoetryPDMRye,那么 uv 的项目 API 对你来说一定不陌生。

项目 API 基于 Python 标准构建,使用 pyproject.toml 来定义项目元数据。

例如,你可以运行 uv init && uv add "fastapi>=0.112" 生成以下内容:

[project]
name = "hello-world"
version = "0.1.0"
readme = "README.md"
dependencies = ["fastapi>=0.112"]

从它开始,uv 将基于项目的依赖项创建一个锁文件。以下是一个示例片段:

[[package]]
name = "fastapi"
version = "0.112.1"
source = { registry = "https://pypi.org/simple" }
dependencies = [
    { name = "pydantic" },
    { name = "starlette" },
    { name = "typing-extensions" },
]
sdist = { url = "https://files.pythonhosted.org/packages/2c/09/71a961740a1121d7cc90c99036cc3fbb507bf0c69860d08d4388f842196b/fastapi-0.112.1.tar.gz", hash = "sha256:b2537146f8c23389a7faa8b03d0bd38d4986e6983874557d95eed2acc46448ef", size = 291025 }
wheels = [
    { url = "https://files.pythonhosted.org/packages/39/b0/0981f9eb5884245ed6678af234f2cbcd40f44570718caddc0360bdb4015d/fastapi-0.112.1-py3-none-any.whl", hash = "sha256:bcbd45817fc2a1cd5da09af66815b84ec0d3d634eb173d1ab468ae3103e183e4", size = 93163 },
]

[[package]]
name = "fastapi-cli"
version = "0.0.5"
source = { registry = "https://pypi.org/simple" }
dependencies = [
    { name = "typer" },
    { name = "uvicorn", extra = ["standard"] },
]
sdist = { url = "https://files.pythonhosted.org/packages/c5/f8/1ad5ce32d029aeb9117e9a5a9b3e314a8477525d60c12a9b7730a3c186ec/fastapi_cli-0.0.5.tar.gz", hash = "sha256:d30e1239c6f46fcb95e606f02cdda59a1e2fa778a54b64686b3ff27f6211ff9f", size = 15571 }
wheels = [
    { url = "https://files.pythonhosted.org/packages/24/ea/4b5011012ac925fe2f83b19d0e09cee9d324141ec7bf5e78bb2817f96513/fastapi_cli-0.0.5-py3-none-any.whl", hash = "sha256:e94d847524648c748a5350673546bbf9bcaeb086b33c24f2e82e021436866a46", size = 9489 },
]

uv 的锁文件就像项目依赖关系的完整快照,它能确保项目在不同机器上的运行环境保持一致。

这个锁文件最大的优势是跨平台。不管你在哪个系统上生成锁文件,它都能在其它平台上正常工作。uv 为每个平台定义了一个独特的解决方案,生成一个可读且可审计的锁文件,精确地定义了将安装哪些软件包。

例如:如果你在 macOS 上运行 uv lock,uv 仍然会为 Linux 和 Windows 生成解析方案,即使每个平台上所需的依赖集稍有不同。

而且它做得非常快。在没有任何缓存的情况下,uv 可以在大约半秒钟内解析 Jupyter 项目的依赖项(在缓存预热的情况下约为 20 毫秒)。

解析 Jupyter 项目时无缓存(上)和有缓存(下)的对比。

项目 API 的核心是 uv run 命令,它能在项目专属环境中运行命令,而且不需要手动激活虚拟环境。

uv run 非常快速。每次执行时,它都会自动重新锁定和同步项目,确保你的环境始终是最新状态。完全不需要手动干预。

换句话说,uv run 能确保你的命令每次都在一个一致的、受锁文件管理的环境中运行。

使用 uv run 命令启动 FastAPI 应用的示例。

有了 uv run,你再也不需要操心虚拟环境的激活、依赖包的管理或者项目的维护更新。一切都变得无比简单。

想了解更多详情,请查阅项目文档

本文翻译并首发于 Python猫:uv:统一的 Python 包管理

依赖源:可编辑依赖、相对路径等

uv 基于 Python 标准构建,如 PEP 621。同时,它还添加了一些在标准中没有的功能,这些功能对本地开发至关重要,如相对路径和可编辑依赖。

在标准的 project.dependencies 部分,你可以定义项目的依赖和可发布的元数据。而在开发过程中,uv 还允许你通过 tool.uv.sources 为这些依赖项指定替代来源。

例如,要使用本地的、可编辑版本的 anyio,你可以运行 uv add --editable ../anyio 来生成以下 pyproject.toml

[project]
name = "hello-world"
version = "0.1.0"
readme = "README.md"
dependencies = ["anyio"]

[tool.uv.sources]
anyio = { path = "../anyio", editable = true }

当发布到 PyPI 时,上述包会声明对anyio 的依赖。但在本地开发时,使用 uv run 可以将 ../anyio 路径下的可编辑的包加到开发环境中。这样,项目的依赖定义保持不变,只是依赖的来源发生了变化。

详细内容请查阅依赖源文档

工作区

Cargo 相同概念的启发,uv 支持工作区:一组管理在一起的包的集合。

想象这样一个场景:在同一个 Git 仓库中,有一个使用 FastAPI 构建的 Web 应用,还有多个作为独立 Python 包开发和维护的库。

大多数大型 Python 项目最终都会用自己的方式来实现这个概念,它们通常借助手写脚本和自定义工具来管理各个包之间的关系。

uv 的工作区 API 为大规模开发中的各种挑战提供了一致、高效且具有创新性的解决方案。

在工作区中,每个包都有自己的 pyproject.toml,但工作区共享一个锁文件,确保工作区使用一致的依赖集运行。

[project]
name = "fastapi"
version = "0.1.0"
readme = "README.md"
dependencies = ["uvicorn"]

[tool.uv.sources]
uvicorn = { workspace = true }

[tool.uv.workspace]
members = ["libraries/*"]

在工作区的根目录下,你可以运行命令来操作任何工作区包。例如,执行 uv run --package fastapiuv run --package uvicorn

更多细节,请查阅工作区文档

本文翻译并首发于 Python猫:(https://pythoncat.top/posts/2025-05-05-uv)

工具

uv 现在有两种新能力:

  • 通过 uv tool install 在专用的隔离虚拟环境中安装命令行工具(如 Ruff)
  • 通过 uvx 直接运行一次性命令,无需预先安装

如果你使用过 pipxnpx,你会发现 uv 的工具 API 很熟悉。

比如,输入 uvx posting 就能直接运行 Darren Burns 开发的 posting 终端界面程序(TUI)。

使用 uvx 命令在终端中运行 posting 的示例。

工具 API 让你能集中管理系统上的 Python 工具。你可以:

  • uv tool list 查看所有已安装的工具及其可执行文件
  • uv tool upgrade --all 将所有工具升级到最新版本

uv 的工具 API 非常快,通过 uvx 执行命令几乎没有任何额外开销。

更多工具功能,请查阅工具文档

Python 引导安装

uv 现在能够安装和管理 Python 本身,使其完全自引导:

$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ uv python install 3.12

如果你的机器上没有安装 Python,或者缺少特定的、所需的 Python 版本,除了显式调用 uv python 外,uv 还可以根据需要,自动下载所需的 Python 版本(如 uv runuv venv 等命令)。

例如,以下是在新的 Ubuntu Docker 镜像上运行 posting 所需的全部命令,没有任何隐藏步骤:

$ apt-get update && apt-get install -y curl
$ curl -LsSf https://astral.sh/uv/install.sh | sh
$ source $HOME/.cargo/env
$ uvx posting

当你运行 uvx 命令时,uv 会一步到位地完成所有工作:

  • 安装 Python 3.12.4(文章写作时的最新稳定版本)
  • 创建虚拟环境
  • 安装必要的依赖包
  • 启动 posting 程序

整个过程无缝衔接,高效快捷。

单文件脚本

最后:uv 现在提供了对单文件 Python 脚本的一等支持,这些脚本可以内嵌依赖元数据,完全符合 PEP-723 标准。

例如,以下文件 main.py,它从 Python 增强提案索引中获取前 10 个 PEP:

import requests
from rich.pretty import pprint

resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])

这个脚本依赖requestsrich,但不包含任何显式的依赖元数据。早些时候,你需要单独管理这些依赖项,例如使用专门的 requirements.txt 文件。

现在,你可以使用 uv add 自动将依赖声明嵌入到脚本中:

$ uv add --script main.py "requests<3" "rich"
$ cat main.py
# /// script
# requires-python = ">=3.12"
# dependencies = [
#     "requests<3",
#     "rich",
# ]
# ///
import requests
from rich.pretty import pprint

resp = requests.get("https://peps.python.org/api/peps.json")
data = resp.json()
pprint([(k, v["title"]) for k, v in data.items()][:10])

有了它,uv run main.py 将在一个隔离的、临时的虚拟环境中执行脚本,并安装所有依赖项。

使用 uv run 执行带有内嵌依赖项的单文件脚本的示例。

你也可以使用--with 标记在运行时指定依赖项,例如:uv run --with "requests<3" --with rich main.py

有了 uv 的 Python 引导安装功能,你只需要 uv 就可以运行封闭式的、可重分发的单文件 Python 脚本,再也不用担心虚拟环境、包管理或 Python 版本的问题。

更多细节,请查阅脚本文档

为规模化而构建

在 Astral,我们的指导原则之一是:“为所有人设计,为规模化构建(Design for everyone, build for scale)。”

我们希望打造的工具对初学者友好,但同时又能满足最大型 Python 项目的需求。

我们相信 uv 已经很好地实现了这两个目标。

如果你在组织里使用 uv,并想一起解决 Python 生态的包管理挑战,欢迎联系我们。让我们携手共创更好的工具。

附录

用 Rust 开发的 Python 包管理工具 uv,可替换 pip、pip-tools 和 virtualenv