Skip to content
/ Python/环境管理
10/9/2025
2.9m
AI 摘要

本文介绍了环境管理从直接 pip 安装到使用 uv 的演变过程,指出传统方法存在依赖冲突和版本管理问题,最后推荐使用 uv 简化虚拟环境创建、依赖管理和配置声明,提升开发效率。

环境管理演变

直接 pip 安装

包直接通过 pip install 安装,然后在项目中导入,例如 pip install requests

这样的问题是

  1. 由于包是安装在全局的,不同项目依赖了同一个包的话,会有冲突
  2. 没有在项目中声明包和对应的版本,其他开发者不好复现开发环境

pip freeze 命令

pip 提供了 freeze 命令,可以将当前环境中的包和版本信息导出到一个文件中,例如 pip freeze > requirements.txt

这样可以确保其他开发者在复现开发环境时,可以使用相同的包和版本,通过 pip install -r requirements.txt 安装对应版本的依赖

这样的问题的:

  1. freeze 命令无法区分我们项目的直接依赖,例如我们只安装了一个依赖,导出到 requirements.txt 中的可能有六七个间接依赖,文件内容很容易爆炸增大
  2. 卸载掉直接依赖,间接依赖不会被删除

虚拟环境

通过创建虚拟环境,可以确保项目在特定的环境中运行,避免依赖冲突和版本问题。

$ python3 -m venv .venv
$ source .venv/bin/activate
$ python3
Python 3.10.15 (main, Sep 19 2024, 03:20:17) [Clang 16.0.0 (clang-1600.0.26.4)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys,pprint
>>> pprint(sys.path)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'module' object is not callable
>>> pprint.pp(sys.path)
['',
 '/opt/local/Library/Frameworks/Python.framework/Versions/3.10/lib/python310.zip',
 '/opt/local/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10',
 '/opt/local/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/lib-dynload',
 '/path/to/your/project/.venv/lib/python3.10/site-packages']
>>>

可以看到,原理是把当前项目的 site-packages 目录添加到 sys.path 中,这样就可以让当前的项目当前目录中 .venv/lib/python3.10/site-packages 下的包。

pyproject.toml

统一的配置文件,除了项目的依赖,还可以在此文件中声明其他的配置,例如

[project]
name = "my_project"
version = "0.1.0"
dependencies = ["Flask==3.1.2"]

[tool.mypy]
exclude = ["tests"]

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

而有了 pyproject.toml 文件后,我们就可以通过 pip install -e .。把当前的项目安装到虚拟环境中了

uv

前面的方式依然有所不足,例如:

  1. 需要 python -m venv .venv 创建虚拟环境
  2. 我们仍然需要手动在 pyproject.toml 中添加包的声明
  3. 通过 pip install -e . 安装依赖

现在有了 uv ,一切都不需要了,例如执行 uv add flask,上面的步骤就都不需要做了

安装

$ curl -LsSf https://astral.sh/uv/install.sh | sh # 安装 uv

包管理

$ uv init project-name # 初始化项目
$ uv add xxx # 安装依赖
$ uv remove xxx # 移除依赖
$ uv sync # 同步依赖,可在修改 .python-version 后运行

Released under the MIT License.