pip
- 即便是传统学院的程序员,也没有选择pip的理由。
virtualenv
- 旧时代的产物,除非还在使用python 2。
venv
python自带的虚拟环境管理,简单是它的优势,也是它的劣势。
只能创建虚拟环境,不能指定系统不存在的python环境版本,不能管理系统中的环境列表(例如选择一个已经创建好了的虚拟环境)。
venv的虚拟环境默认是存放在项目文件夹里的,这会影响项目文件的管理。
pipenv
- requests库作者Kenneth Reitz大神的作品。但pipenv并不稳定,例如,如果你运行
pip install...
两次,结果可能不一样,pipenv
曾承诺解决这个问题,但实际上,它只是多次尝试运行pip install <单个包>
,直到结果看起来差不多符合规范。显然,这样的方式更慢,但最终问题依然存在。
anaconda / conda :
anaconda实在过于臃肿,它的安装包里包括了众多科学计算会用到的packages,安装后动辄5-6个G。
anaconda有个不包含packages的版本,叫miniconda,但miniconda仍然存在安装依赖库过于激进的问题,安装同样的packages,conda总会比别的包管理器安装更多的“依赖包”,即便有的“依赖包”并不是必须,这会导致你的项目出现不必要的膨胀。
同时,conda的packages列表“conda list”还存在和“pip list”不一致的问题。
poetry
在uv出现前最好用的管理工具。
poetry使用pyproject.toml 和 poetry.lock文件来管理依赖,类似于JavaScript/Node.js的Npm和Rust的Cargo,这俩都是非常成熟好用的依赖管理方案。
poetry本身并不具有管理Python解释器的功能,推荐和pyenv/pyenv-win使用,可以轻松下载和设置不同版本的Python解释器。
poetry的缺点可能是较为复杂,上手困难。由于poetry严格的依赖管理策略,你可能会在安装依赖包时遇到更多的问题。
在国内,poetry还有另一个缺点,无法设置全局镜像源,只可针对单个项目设置镜像源。
uv:唯一真神
uv 是一个由 Astral 开发的 高性能 Python 包管理和项目管理工具,用 Rust 编写,旨在取代传统的 Python 工具(如 pip、virtualenv、poetry、甚至部分 pyenv 功能)。它以极快的速度和现代化的设计著称,号称比 pip 快 10-100 倍,比 Poetry 快 2-10 倍。uv 的目标是提供一个统一的、一站式的 Python 开发体验,涵盖包安装、虚拟环境管理、项目管理和 Python 版本管理。
uv使用rust构建,uv的维护者astral还有另一个大名鼎鼎的python代码格式化工具ruff,在使用ruff和uv时,你能明显感觉到和其它基于python的工具的差距,指哪打哪,非常爽快。
uv和poetry一样使用
pyproject.toml
和lock文件
管理依赖,很现代,用过的都说好。uv还同时管理python解释器,也就是集成了pyenv的功能,可以方便地下载和管理解释器。在python解释器小版本更新时(例如3.12.0→3.12.1),uv也会自动更新,以后再也不用苦嘻嘻的去python官网找解释器了。
将uv生成的项目拷贝到没有python环境的电脑上,只需使用命令“uv sync”,uv会自动安装python解释器,并接着安装pip依赖,如果使用“uv run”,uv还会在全部安装妥当后,自动开始运行脚本。
uv甚至还集成了pipx安装python全局工具的功能,例如ruff、isort、mypy、pyright这类全局工具,可以使用“uv tool”安装、升级和管理。
即便你是一个纯粹的“pip”命令爱好者,uv也可以满足你。uv提供了“uv pip”系列命令,可以同时具备rust的爽快和pip的学院派感觉,堪称古典与现代的结合。
在最新的pycharm版本(2024.3.2或以上)里也添加了uv的支持,使用pycharm和uv管理项目甚至不需要写命令行。
uv的缺点可能是还比较新,社区相较pip、conda之类的来说还不成熟,遇到问题可能不容易找到答案。