今天聊一聊Python开发中的多版本管理以及依赖包管理工具,由于近年来开源社区生态的愈发成熟,社区涌现出一大批优秀的版本管理工具和包管理工具,可谓是长江后浪推前浪,呈现出了老中青三代的态势,老牌的代表作有pip、pipenv、venv、pythonz、virtualenv、 conda、中生代的代表有:pyenv、poetry、pdm、hatch、新生代的代表有rye、uv等,当然我相信社区中肯定还有很多优秀的此类工具,再次就不一一列举了;
把这些名字放在一起看,可能给人的第一感觉都差不多,不都是包管理工具么,其实,如果仔细稍微深入的了解一下,你可能知道这些工具之所以火起来都是有一定的原因的,有的专注于性能 方面、有的专注于和pep规范的结合、也有的专注于做大而全、还有一些专注于小而精,下面我将结合个人的学习实践经历,从Python的多版本管理以及依赖包管理两个方面来介绍一下社区主流的此类工具以及应用场景。
关于Python版本的管理工具
在日常开发过程,可能会有多个不同Python版本的共存的需求,以下介绍几种关于python多版本共存的解决方案.
uv(☆)
- 简述:uv是一个非常快的Python包和项目管理器,是用当下比较热门的Rust语言开发的(Rust rewrite everything),主打高性能和大一统,既能管理python的多版本,又能高效的管理依赖包,【摘录官方文档:A single tool to replace
pip
,pip-tools
,pipx
,poetry
,pyenv
,twine
,virtualenv
, and more.】,目前的star数:25k, - 详细的介绍与使用:官方文档, Github地址
- 实践感觉:个人感觉还是很不错,如果不执念python栈的工具,这款值得试一试,推荐。
conda
-
简述:Conda 是一款功能强大的命令行工具,用于在 Windows、macOS 和 Linux 上运行的包和环境管理,通过创建不同python版本的虚拟环境进行多版本的管理,其中conda分为完整版(Anaconda)和精简版(Miniconda),根据需要选择合适的版本。
-
实践感受:
-
对于日常在一个环境有多Python版本的开发需求的,且不想在开发环境中安装多个原生Python,Anaconda和Miniconda都是一个很好的选择;
-
对于使用Python进行数据分析、机器学习及AI方向的开发者,Anaconda是一个很好的选择;
-
对于Python web开发来说,Miniconda是一个不错的选择,主要是因为适合web开发的环境包管理工具的选择是很多的。
-
PDM (☆)
-
简述:PDM 是一个现代 Python 包和依赖项管理器,支持最新的 PEP 标准。但它不仅仅是一个包管理器。它在各个方面提高了您的开发工作流程,并且有灵活强大的插件系统,支持选择加入集中式安装缓存。
-
实践感受:
-
目前是个人工作中主要使用的就是PDM,当然要推荐啦,
-
对于使用python多版本的方法,安装pdm后,通过
pdm python install 3.x.x
方式进行安装,通过pdm python install --list
查看可安装的版本清单 -
如果只需要python解释器,且已经安装了pdm工具,推荐使用此方式进行安装。
-
pyenv
- 简述:pyenv 可让您轻松地在多个 Python 版本之间切换。它简单、不引人注目,并且遵循 UNIX 单一用途工具只做好一件事的传统。该项目是从rbenv和ruby-build分叉出来的,并针对 Python 进行了修改。
- 详细安装与使用: Github地址
- 实践感觉:
Python
- 简述:从Python官网下载需要安装的Python版本,在不同的目录(建议:目录名使用和版本对应的名称)中安装下载好的安装包,安装后,在环境变量中设置一个常用的Python版本作为默认版本,后续如果需要修改python版本,只需要修改环境变量中python解释器路径即可。
- 详细的介绍和安装阅读:官方文档
pythonz
- 简述:支持 CPython、Stackless、PyPy 和 Jython 的 Python 安装管理器
- 详细介绍与使用:官方文档、Github地址
- 实践感受:
- 没有使用过,基本也不考虑后续使用,只是无意中看到后简单官方介绍,仅此记录一下
关于依赖包的管理工具
PDM(☆)
-
简述:此工具是一款跨平台包管理工具,要求python3.7+,主要的功能和上述的Poetry类似,但它摈弃了虚拟环境,直接将包文件夹放在项目根目录下,或放到统一的地方进行集中管理,另外其由一位国内的开发者在业余时间开发而成,主要特点有:
-
实践感受:
-
在知道此工具后,逐渐放弃了poetry,当前star数刚达到7.9k,个人看好此工具的后续发展。
-
自定义脚本使用体验非常好。
-
Poetry
-
简述:此工具是一个跨平台(Windows, macOS, and Linux)、开源的第包管理工具平台,本质还是需要创建虚拟环境进行包管理,官方描述:Python packaging and dependency management made easy;最新版本需要开发环境的python3.8+,其主要特点有:
-
支持多种安装方式如:官方包安装、pipx安装、pip安装等
-
取代了 setup.py、requirements.txt、setup.cfg等,仅通过pyproject.toml文件就能轻松机进行包的版本版本和迁移工作
-
可以对包的安装场景进行分类管理如开发(静态检查相关包)、测试(pytest)、生产环境包的分组
-
在配置文件中支持自定义Scripts,如:poetry run python xxx;
-
-
实践感受:
-
在生产环境中此工具被越来越多的项目引入使用,目前star超26k;
-
个人在近两年(PDM发现之前)的web开发中均由在使用,在体验上相当不错,缺点是如果不配置国内源,现在安装效率是极低的,且容易安装出错。
-
用好自定义脚本的功能可大大提升效率。
-
Conda
- 简述:Conda是一个跨平台(Windows, macOS, and Linux)的开源的环境及包管理平台,官方称不仅限于管理Python版本和环境包的管理,还可以管理 R, Ruby, Lua, Scala, Java, JavaScript, C/ C++, Fortran等主流语言,但据笔者了解到,除了python开发者圈应用广泛外,其他语言的开发者几乎很难看到使用的。
Pipenv
-
简述:此工具是一个跨平台(Windows, macOS, and Linux)的开源的python虚拟环境管理工具,依赖于开发环境中原生安装的Python版本(目前官方仅支持Python3.7+)其主要特点有:
-
使用Pipfile和Pipflile.lock文件来维护环境中的包版本
-
支持pipenv CLI操作
-
-
实践感受:
-
个人安装官方文档实操过一遍,并未在生产环境中将其引入。
-
在实操过程中给人的体验还是不错的。
-
venv
-
简述:Python原生安装包中内置的虚拟环境,每个虚拟环境将拥有它们自己独立的安装在其 site, 使用起来比较简单
-
实践感受:
- 个人认为在使用docker构建项目是采用改工具进行包管理体验比较好,轻量简单易用。
Virtualenv
-
简述:依赖于开发环境中的原生Python,仅能创建相同Python版本的不同虚拟环境,在早期的web开发中使用比较多。
- 跟详细的介绍请阅读官方文档
-
实践感受:
- 在刚从事Python相关学习和工作使用的比较多,近些年几乎不在使用,因为又上述更好的工具取代了它,不过有兴趣的小伙伴可以体验体验。
virtualenvwrapper
-
简述:依赖于上述的Virtualenv,其本质是一个virtualenv的脚本工具,可以方便的创建和删除虚拟环境。
-
实践感受:
- 在个人早起使用virtualenv,基本都是搭载了virtualenvwrapper工具来进行相关开发工作。
Hatch
-
简述:Hatch 也是一款虚拟环境管理工具,可以管理环境(它允许每个项目有多个环境,但不允许把它们放在项目目录中),并且可以管理包(但不支持 lockfile)。Hatch 也可以用来打包一个项目(用符合 PEP 621 标准的 pyproject.toml 文件)并上传到 PyPI。
-
实践感受:
- 仅知道此工具,从未实操体验过,是否推荐需要后续实操体验后才能决定。
Rye
- 简述:使用Rust开发,暂未研究,值得关注
简述:An installation and dependency system for Python,此项目近两年未更新了。
总结
通过前面的介绍其实可以看出,Conda、PDM、uv都能一站式的管理python版本和依赖管理,其他的工具或多或少的需要其他工具的配合才能达到要求,对于个人而言,目前conda和PDM使用都比较熟练,只是conda比较重(虽然有miniconda),所以近一年多都在使用PDM,同时后续会持续关注uv,并计划使用uv。