返回专题首页

Python 专题

管理好你的依赖:venv、pip 与 pyproject.toml

很多 Python 项目真正的混乱,并不是从业务代码开始的,而是从环境和依赖开始的。解释器版本不同、包版本冲突、虚拟环境混用、依赖描述不完整,都会让一个项目变得难以复现、难以上手。

Python 专题第 22 篇 / 39 篇4 分钟

很多 Python 项目真正的混乱,并不是从业务代码开始的,而是从环境和依赖开始的。解释器版本不同、包版本冲突、虚拟环境混用、依赖描述不完整,都会让一个项目变得难以复现、难以上手。

这一节我们会把虚拟环境、依赖安装、版本锁定、requirements.txtpyproject.toml 的关系讲清楚,帮助你建立一套更现代、也更适合团队协作的依赖管理方式。

为什么依赖管理会影响项目寿命?

很多人第一次写 Python 项目时,习惯直接在全局环境里 pip install。短期看起来很快,但项目一多就会出现:

  • A 项目需要某个旧版本依赖;
  • B 项目又需要新版;
  • 系统里到底装了什么、版本是什么,很难追踪;
  • 换台机器就无法复现。

这意味着依赖管理问题本质上不是“装包方式问题”,而是项目是否可复现、可协作的问题。

一个项目写得再漂亮,如果别人拉下来跑不起来,它的可维护性也会大打折扣。

虚拟环境:venv 的使用方式

虚拟环境的核心价值,是把项目依赖隔离开来。

使用 venv 后,每个项目都可以拥有自己独立的一套第三方包,不会互相污染。

这意味着你在项目里安装 fastapisqlalchemypytest 时,实际上是在这个项目自己的环境里操作,而不是往系统 Python 里不断堆东西。

所以虚拟环境不应该被理解成“可选增强”,而应该被当成现代 Python 项目的默认基础设施。

pip 安装、升级与锁定版本

pip 是最基础的依赖安装工具,它解决的是“如何把第三方包装进当前环境”。

但真正重要的不是会不会执行安装命令,而是知道版本管理要有边界感。

例如:

  • 某些核心依赖适合锁精确版本,确保稳定复现;
  • 某些外围依赖可以接受一个范围,便于升级;
  • 安装新依赖后,要及时同步依赖描述文件。

依赖版本一旦处于“本地装过但没记录”的状态,项目就已经埋下了后续复现困难的种子。

requirements.txtpyproject.toml

两者的角色差异

requirements.txt 更像是“安装清单”,强调把某些包按特定版本装进环境。

pyproject.toml 则更像项目的统一配置入口。除了依赖声明,它还可以承载构建、格式化、Lint、测试等工具配置。

因此在现代 Python 项目里,pyproject.toml 的地位越来越重要。它让项目配置不再散落在一堆零碎文件里,而更集中、更统一。

你可以把两者简单理解成:

  • requirements.txt 偏安装层和部署层;
  • pyproject.toml 偏项目描述层和工具协同层。

不同项目会根据团队习惯有所差异,但总体趋势是越来越多工程能力开始向 pyproject.toml 聚拢。

开发依赖与生产依赖如何划分?

并不是所有依赖都应该一股脑装进同一组里。

例如:

  • Web 框架、数据库驱动属于运行时依赖;
  • pytestruffmypy 这类通常属于开发依赖。

把这两类依赖分开,有几个好处:

  • 部署环境更干净;
  • 依赖意图更清晰;
  • 团队更容易理解哪些包是业务运行必须的,哪些只是开发阶段使用的。

所以依赖管理真正成熟的标志之一,不是文件里列了多少包,而是依赖有没有被按职责组织清楚。

总结与预告

这一节我们把 Python 项目最容易变乱的依赖管理问题做了系统梳理。一个项目是否容易复现、是否适合协作,往往首先取决于环境和依赖是否被好好管理,而不是代码本身写得多漂亮。

接下来我们会把依赖管理继续往前推进到质量保障层面,看看格式化、Lint、类型检查和提交前校验如何形成一套可靠的开发底线。