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

推荐订阅源

T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
Google DeepMind News
Google DeepMind News
Attack and Defense Labs
Attack and Defense Labs
Webroot Blog
Webroot Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
TaoSecurity Blog
TaoSecurity Blog
I
Intezer
Application and Cybersecurity Blog
Application and Cybersecurity Blog
N
News | PayPal Newsroom
S
Security Affairs
T
Tor Project blog
P
Proofpoint News Feed
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
H
Heimdal Security Blog
Hacker News: Ask HN
Hacker News: Ask HN
Help Net Security
Help Net Security
U
Unit 42
云风的 BLOG
云风的 BLOG
The Hacker News
The Hacker News
Cisco Talos Blog
Cisco Talos Blog
量子位
F
Full Disclosure
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
有赞技术团队
有赞技术团队
T
Troy Hunt's Blog
P
Privacy & Cybersecurity Law Blog
Forbes - Security
Forbes - Security
人人都是产品经理
人人都是产品经理
L
Lohrmann on Cybersecurity
Apple Machine Learning Research
Apple Machine Learning Research
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
腾讯CDC
AI
AI
Last Week in AI
Last Week in AI
Latest news
Latest news
Google Online Security Blog
Google Online Security Blog
N
Netflix TechBlog - Medium
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
IT之家
IT之家
Martin Fowler
Martin Fowler
Blog — PlanetScale
Blog — PlanetScale
V2EX - 技术
V2EX - 技术
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 漫思

python使用.env构建开发和生产环境 python项目的构建 nodejs构建CICD时的思考  成为 AI 智能体工程师的 10 个步骤 es6的 yield python 中的 yield 笔记本的A壳 thinkpad 更换 reduce() in Python python的字段赋值和取值的操作 python的语法类似于lodash分组展开,合并分组操作 SelectMany C# lodash 数组的常用做法 lodash里面的常用方法 技术的边界 Reduce 和 Transduce 的含义 尤雨溪创办的 VoidZero 官宣加入 Cloudflare,前端 Vite 等保持开源 Ramda 函数库参考教程 ramda es 数组的方法 flatmap map object.entity的教程 Map与FlatMap:在数据处理中的区别与联系 flat、flatmap与map的用法区别1 flat、flatmap与map的用法区别 AI不是从天而降,它经历了七十年三起三落:读懂AI的第三课 Agent 17 种架构模式 分析 & 思考 只有踩过坑才懂:前端生成唯一 ID,别用 Date.now ()了!试试它crypto.randomUUID() FastAPI python并发 代码是 AI 写的,生产事故谁背锅? AI Agent 走出 Demo 幻觉的唯一解药:Harness Engineering 高管的 AI 精神病 小米开源可控视频音效生成模型 ControlFoley ​IBM 联合红帽投资 50 亿美元:帮助企业确保开源软件安全 国家大基金领投 DeepSeek,首轮融资投前估值 450 亿美元 SpaceX 自研 AI 训练栈 V1.0 接近完工:用 C 重写、适配 22 万块 GB300 GPU 高管的 AI 精神病 - 漫思 做一款企业真正敢用的AI测试应用,到底有多难?究竟难在哪? - 漫思 工良吐槽篇:万字长文细说 AI 落地之笑谈 koarouter的路由基本能力 7. 简单语句 class-validator class- @koa/router 分路由 这是我见过的最好的koa2 classvalidate typeorm的能力 HLS.js destroy时会取消请求吗 从入门到精通:2025年本体管理工具选型指南,8款工具助你驾驭语义网络 一文入门智能体:dify 超快速构建AI agent C# 15 类型系统改进:Union Types skill网站 应无所住,而生其心 process.stdin.isTTY 谷歌学术走过风雨十年 听创始人畅谈苦辣酸甜 - 漫思 process.stdin.isTTY 是false的具体情况 asyncio 较为复杂的demo asyncio 简单demo python Annotated 独家解读:淘宝使用 Node.js 的 TypeScript 多场景开发和实践 mac uv 使用 Python 包管理工具 uv 使用教程 Python依赖管理新标杆:UV工具安装与实战指南 lobehubui python的enum通过int进行初始化 python的枚举类型 深度拆解:AI 智能体 Harness 的构造【译】 LlamaIndex是什么?LlamaIndex综述!看这一篇就够了! python和langchain的简单教程 nodejs的顶尖开源项目 基础Pydantic+TypedDict+Annotated +Dataclass 深度解析Python结构化数据工具:dataclass、Pydantic Model与TypedDict 被 LangChain 全家桶搞晕了?LangGraph、LangSmith、LangFlow 一文读懂 - 漫思 谁才是企业级开源平台的优选?OpenCSG与Dify、Coze、Langflow、Ollama 的差异化之路 四大框架全景解析:LangChain、LangGraph、DeepAgent、LangFlow 测试数据管理方式对比:dict vs dataclass vs TypedDict 革命性的写作:MDX 让你的 Markdown 全面动起来 Python - pydantic 入门介绍与 Models 的简单使用 欢迎使用 Pydantic¶ python模块导入 Python 里通常说“数组切片”,大多数时候指的是列表切片。基本格式是: 自定义hook的写法 Python 遍历字典的8种方法 python基础教程 or的简单用法 C# 15 引入了 联合类型 asyncio的基础理论 flask配置热更新 Form.Item 无法直接绑定两个 name Form.Item 的双向翻译官:getValueFromEvent 与 getValueProps Knex.js入门指南:Node.js最强大的SQL查询构建器 knex.js1 Knex.js RFC 9535:JSONPath 的标准化之路 C#多线程Thread.Join()的详解 Pretext:值得关注的文本排版引擎 Flask入门(四):Flask静态文件及配置 【高并发】消息队列思路 为何高并发系统中都要使用消息队列?这次彻底懂了! Node.js 消息队列应用:RabbitMQ、Kafka 与处理高并发任务 大文件上传下载处理方案-断点续传,秒传,分片,合并 Node.js 缓存策略优化:Redis、Memcached 与本地缓存实现 .NET开发者的救星:8个让你告别996的高效库 别再吹牛了,100% Vibe Coding 存在无法自洽的逻辑漏洞!
python的uv
漫思 · 2026-05-20 · via 博客园 - 漫思

uv

我准备用 uv 初始化一个 python 项目

环境

我用的是苹果笔记本 MacBookPro ,具体的操作系统及硬件参数如下:

uv 的介绍与安装

uv 是一个使用 Rust 编写的工具,可以用来替代 pip、pipenv、pipx、poetry、virtualenv 等工具的使用,甚至还可以用来管理系统中所安装的 Python 发行版。uv 借鉴了很多现代语言中对于项目依赖的管理方式,项目中对于依赖的管理要远远优于使用 pip 和requirements.txt的方式。

我之前用过 pip 、pipx 等工具,发现 uv 确实要快不少。具体有多快呢? github 上有个图:

速度比传统 pip 快 10-100倍。

根据官网的介绍,uv 主要支持以下功能:

  • 支持版本锁定的项目依赖管理。
  • 支持直接运行 Python 脚本。
  • 支持对系统中安装的 Python 进行管理,支持多版本 Python 共存。
  • 支持 Python 包的发布和安装。
  • 支持兼容 pip 的应用接口。
  • 支持 Cargo 模式的项目工作区管理。
  • 更优化的全局支持库缓存。
  • 运行无需 Rust 或者 Python 支持。
  • 支持 Windows、macOS 和 Linux 系统

uv 对多 python 版本和环境的管理很不错,这样你就可以一个项目指定一个特定的 Python 版本,放心使用,想怎么折腾怎么折腾,不会影响全局。

最近比较火的 MCP 很多也是用 uv 运行的,因为用 uv 命令可以直接运行 python 脚本。

uv 的安装非常简单:

# macOS和Linux
curl -LsSf https://astral.sh/uv/install.sh | sh

# Windows PowerShell
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

uv 对 Python 的环境管理

首先用 uv 管理一下我们本机安装的 Python 环境。即到底安装了几个、哪些版本的 python。

可以用 uv python list 查看,像这样:

可以看到我已经安装了多个版本的 python。 在后面建项目的时候,我选用 3.13 这个版本。当然你也可以根据你的情况下载新的需要使用的版本。这里给出一组相关命令:

uv python install,安装指定版本的 Python。
uv python list,列出系统中当前已经安装的 Python 版本。
uv python find,查找一个已经安装的 Python 版本。
uv python pin,固定当前项目使用指定的 Python 版本。
uv python uninstall,卸载指定版本的 Python。

比如我要安装 3.12 这个版本,我就可以这样:

装好了不想要了,就可以这样卸载掉它:

uv 进行项目管理

python 的环境有了以后,我们就可以新建项目了,建项目的时候也要用 uv 来进行初始化。

uv 的项目管理功能更多的借鉴了 Rust 中 Cargo 工具的项目管理理念。但主要区别是 uv 是通过项目目录中的pyproject.toml文件来完成项目管理的。

初始化后会生成以下几个文件 :

虽然 uv init myproject 会帮你创建项目目录和 pyproject.toml,但默认 不会自动创建虚拟环境(env),所以我们需要手动创建。

# 手动创建虚拟环境
uv venv --python 3.13
# 激活虚拟环境
source .venv/bin/activate

虚拟环境激活后,项目中会多一个.venv 文件夹。

接下来我们要自己创建一下源码目录和测试目录:

到这里工程的相关目录我们就先到此为止,基本上创建完了,然后我们来编辑

pyproject.toml 配置文件。

toml 配置文件

我们先介绍一下 toml 文件,可能有些朋友不怎么了解它,比如搞 java 开发的。

TOML(Tom's Obvious, Minimal Language)是一种配置文件格式,设计目标是易读、易写、易于解析,非常适合作为程序的配置语言,尤其是在现代的跨平台开发中被广泛采用。

你看这名字是不是觉得肯定跟 Tom 大哥有关系?

对,因为 TOML 由 GitHub 联合创始人 Tom Preston-Werner 在 2013 年发起,用以替代 JSON、INI 等配置格式在可读性和灵活性上的不足。

不过吧,后来这大哥(和她媳妇)不在 GitHub 干了,因为他们的一些不光彩的行为。具体是什么就不多说了,想八卦一下的可以去查查。

toml 配置文件用途广泛,常用于以下场景:

  • 应用程序运行时配置
  • 包管理工具(如 Python 的 pyproject.toml、Rust 的 Cargo.toml)
  • 构建工具配置(如 poetry.toml, uv.toml)
  • 数据库或服务连接信息等环境参数配置

举个例子吧:

# 数据库配置
[database]
server = "192.168.1.1"
ports = [ 8001, 8001, 8002 ]
enabled = true

# 应用信息
[app]
name = "MyApp"
version = "1.0.0"
release_date = 2025-04-25T12:00:00Z

TOML 的特点可以总结为:

“比 JSON 更适合人读,比 YAML 更适合程序解析。”

它已经成为现代软件开发中最流行的配置文件格式之一,特别是在需要 清晰结构 + 丰富类型 + 可维护性 的场景中表现出色。

常见语言的支持情况:

  • Python:tomli / toml / pytoml / tomllib(Python 3.11 原生支持)
  • Rust:官方包管理工具 Cargo 就使用 TOML 格式的 Cargo.toml
  • Go:支持 BurntSushi/toml 库
  • Node.js:支持 @iarna/toml 等多个库

常见用途:

  • Python 包管理:pyproject.toml(PEP 518 标准)
  • Rust 项目管理:Cargo.toml
  • Web 项目配置:netlify.toml
  • DevOps 工具:例如 uv 的配置也是用 toml 文件

TOML 与其他格式的对比:

特性TOMLJSONYAMLINI
可读性 ✅ 高 中高(但复杂)
注释支持 ✅ 支持 ❌ 不支持 ✅ 支持 ✅ 支持
数据类型支持 ✅ 多 ✅ 多 ✅ 多 ❌ 有限
库支持 ✅ 常见语言皆支持 ✅ 全面 ✅ 全面 ✅ 较好
学习曲线 ✅ 低 ✅ 低 ❌ 偏高 ✅ 极低

你看,TOML 作为配置文件感觉很不错对吧。

我们关于 TOML 的介绍就到此为止,现在来说一下我们这个初始化的新项目中的 pyproject.toml 文件要写成什么样。

就这样:

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"

[project]
name = "myproject"
version = "0.1.0"
description = "一个基于Python 3.13.3的项目"
readme = "README.md"
requires-python = ">=3.13"
authors = [
    {name = "xiaobox", email = "xiaobox@gmail.com"}
]
dependencies = [
    "pytest>=7.4.3",
    "fastapi>=0.110.0",
    "uvicorn>=0.27.0",
    "httpx>=0.27.0",
]
classifiers = [
    "Programming Language :: Python :: 3.13",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]

[project.scripts]
myproject = "src.main:main"

[project.urls]
"Homepage" = "https://github.com/yourusername/myproject"
"Bug Tracker" = "https://github.com/yourusername/myproject/issues"

[project.optional-dependencies]
dev = [
    "black>=23.1.0",
    "isort>=5.12.0",
    "mypy>=1.5.1",
]

[tool.pytest]
testpaths = ["tests"]

[tool.black]
line-length = 88
target-version = ["py313"]

[tool.isort]
profile = "black"
line_length = 88

[tool.hatch.build.targets.wheel]
packages = ["src"] 

别小看了这个文件,它可是一个使用了 Hatch 构建工具、遵循 PEP 621 和现代 Python 项目结构规范的项目配置,涵盖了运行依赖、开发依赖、CLI 脚本、格式化工具配置、测试路径和打包目标,非常完整规范。

所以我们得逐行解释一下这个重要的文件。

toml 配置文件的逐行解释

我们上面的配置文件是一个标准的 Python 项目使用 pyproject.toml 来管理构建系统、依赖、工具配置的典型示例。下面我们来拆解和解释一下。


[build-system]:构建系统配置(PEP 517 标准)

[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
  • requires:构建该项目所需的构建工具,这里是 hatchling,必须先安装。
  • build-backend:指定用哪个构建后端来执行打包任务,这里是 hatchling.build

hatchling 有点儿类似 java 中的 Maven 或 Gradle,都是用来执行自动化构建流程的。

  • Maven 是把 java 代码编译、构建成 jar 包,方便管理依赖、分发、版本控制
  • hatchling 是把 python 代码构建成 Wheel(.whl 文件)或 Source Distribution(.tar.gz 或 .zip 文件),也是为了做依赖管理、分发和版本控制。

总结来说:Python 的构建是将代码和依赖打包成 .whl 或 .tar.gz,类似于 Java 打包成 .jar。核心目的是简化分发、确保环境一致性、自动化依赖管理。


[project]:项目的核心元信息(PEP 621 标准)

[project]
name = "myproject"
  • 项目名称,最终发布到 PyPI 时会用这个名字。
  • 当前版本号。
description = "一个基于Python 3.13.3的项目"
  • 简短的项目说明。
  • 指定项目的 README 文件,将作为 PyPI 上项目首页的介绍内容。
requires-python = ">=3.13"
  • 要求的 Python 版本最低为 3.13。
authors = [
    {name = "xiaobox", email = "xiaobox@gmail.com"}
]
  • 作者信息,支持多个,用列表表示。
dependencies = [
    "pytest>=7.4.3",
    "fastapi>=0.110.0",
    "uvicorn>=0.27.0",
    "httpx>=0.27.0",
]
  • 项目的运行时依赖库,在安装时会自动安装这些包。这里我加入了 pytest、fastapi 的依赖,因为我想把这个项目作为一个 api 服务提供出去。
classifiers = [
    "Programming Language :: Python :: 3.13",
    "License :: OSI Approved :: MIT License",
    "Operating System :: OS Independent",
]
  • 用于 PyPI 分类(帮助搜索和筛选)。

[project.scripts]:定义可执行命令(如 CLI)

[project.scripts]
myproject = "src.main:main"
  • 安装后运行 myproject 命令会调用 src/main.py 中的 main() 函数。(我们需要提前把之前的 main.py 文件要先移动到 /src 目录下)

[project.urls]:项目的相关链接(非必须)

[project.urls]
"Homepage" = "https://github.com/yourusername/myproject"
"Bug Tracker" = "https://github.com/yourusername/myproject/issues"
  • 为项目指定一些有用的链接,如主页、问题反馈页等。

[project.optional-dependencies]:可选依赖(比如开发环境)

[project.optional-dependencies]
dev = [
    "black>=23.1.0",
    "isort>=5.12.0",
    "mypy>=1.5.1",
]

我们为开发环境安装了三个库:black、isort 和 mypy

介绍一下这三个工具

  • black:是一个 Python 代码格式化工具。自动把你的 Python 代码排版成统一风格,比如:缩进、换行、空格都按标准格式处理,让你的 Python 代码看起来更整齐、统一,无需自己动手排版。
  • isort:是一个 Python 导入(import)语句自动排序工具。自动整理文件顶部的 import 语句,比如按字母顺序排列,分组标准库、第三方库、自定义模块,保持导入部分有序且规范。
  • mypy:是一个 Python 静态类型检查工具。检查你的代码里的类型注解(type hints)是不是正确,比如函数参数和返回值类型对不对,帮你在写代码时发现类型出错的地方,提前避免 bug。

[tool.pytest]:Pytest 配置

[tool.pytest]
testpaths = ["tests"]
  • 指定测试用例所在路径,pytest 会从 tests/ 目录开始查找测试文件。

[tool.black]:代码格式化工具 Black 的配置

[tool.black]
line-length = 88
target-version = ["py313"]
  • 设置代码的行最大长度为 88(默认值),目标 Python 版本是 3.13。

[tool.isort]:import 排序工具 isort 的配置

[tool.isort]
profile = "black"
line_length = 88
  • 使用 black 的风格对 import 排序。
  • 设置行长度为 88,与 black 保持一致。

[tool.hatch.build.targets.wheel]Hatchling 打包配置

[tool.hatch.build.targets.wheel]
packages = ["src"]
  • 指定打包时要包含的代码目录为 src

用一句话总结下这个 pyproject.toml 配置文件 :

“这是一个使用 Hatch 构建工具、遵循 PEP 621 和现代 Python 项目结构规范的项目配置,涵盖了运行依赖、开发依赖、CLI 脚本、格式化工具配置、测试路径和打包目标,非常完整规范。”

安装和更新依赖

上面这个文件编辑完成后,我们就可以 安装项目和开发依赖了:

uv pip install -e ".[dev]"

如果后面你更新了 pyproject.toml 文件可以执行以下命令来 “手动刷新” 一个依赖库:

加入 --extra dev 参数是因为 uv sync 默认只安装 [project.dependencies] 中列出的正式依赖。

不会自动安装 [project.optional-dependencies](比如 dev 里面的 black、isort、mypy)

uv sync --extra dev 的意思是:除了正式依赖,还要把 [project.optional-dependencies.dev] 里的东西也同步上

uv.lock

当执行完 uv sync --extra dev ,安装好依赖好, uv 会在项目根路径生成一个 uv.lock 文件 。uv.lock 是 锁定依赖版本 的文件。

它的作用是:把 pyproject.toml 里描述的依赖(比如 "fastapi>=0.110.0" 这样比较宽松的范围),具体锁定成明确、唯一的版本(比如 "fastapi==0.110.1")。

这样,每次安装时,不管谁来安装(你自己、你的同事、你的服务器),大家安装的依赖版本都是一模一样的,不会因为小版本不同导致奇怪的 bug。

uv.lock 是自动生成、自动管理的。不需手动编辑。

其他

其他的,如 fastapi 相关的、 打 docker 镜像部署什么的相对本文主题超纲了,就不在本文中过多描述了。

总结

本文我们分享了用 uv 初始化和管理 Python 项目的完整流程。

从安装 uv 开始,我介绍了它为什么比传统工具(pip、pipx、poetry 等)更快更好用,以及 uv 在多 Python 版本管理、依赖锁定、项目初始化方面带来的便利。

随后,详细讲了如何用 uv 管理本地 Python 环境、新建项目、创建虚拟环境、编辑 pyproject.toml 配置,并逐步解释了各个配置项的作用

整体来看,uv 提供了一套现代、规范、高效的 Python 项目管理方案,非常适合用来打基础,后续无论是开发 API、打包 Docker 镜像,还是部署上线,都能有条不紊地进行。

同时我们通过在项目创建的过程中看到各语言(java、nodejs...)都相通或类似的工程 “最佳实践”,真是应了那句话:“大道至简,真理趋同”