环境管理演变
直接 pip 安装
包直接通过 pip install 安装,然后在项目中导入,例如 pip install requests
这样的问题是
- 由于包是安装在全局的,不同项目依赖了同一个包的话,会有冲突
- 没有在项目中声明包和对应的版本,其他开发者不好复现开发环境
pip freeze 命令
pip 提供了 freeze 命令,可以将当前环境中的包和版本信息导出到一个文件中,例如 pip freeze > requirements.txt
这样可以确保其他开发者在复现开发环境时,可以使用相同的包和版本,通过 pip install -r requirements.txt 安装对应版本的依赖
这样的问题的:
freeze命令无法区分我们项目的直接依赖,例如我们只安装了一个依赖,导出到requirements.txt中的可能有六七个间接依赖,文件内容很容易爆炸增大- 卸载掉直接依赖,间接依赖不会被删除
虚拟环境
通过创建虚拟环境,可以确保项目在特定的环境中运行,避免依赖冲突和版本问题。
$ 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
前面的方式依然有所不足,例如:
- 需要
python -m venv .venv创建虚拟环境 - 我们仍然需要手动在
pyproject.toml中添加包的声明 - 通过
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 后运行