Skip to content
0

环境管理演变

直接 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.