virtualenv系列 (1) · 导致Python多版本依赖困境的根源

Python的包管理系统设计之初借鉴了Yum等Linux包管理工具的理念,仅允许同一软件包存在一个版本,这与Java中Maven允许多版本共存的设计形成对比。这种设计导致在本地开发环境中难以满足不同Python项目对依赖包的不同版本需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多版本依赖管理一直是Python的一个痛点,广受诟病,尽管这么多年下来,Python早已提出了以“虚拟环境”为代表的多种成熟解决方案,但依然难掩Python在设计自己的包管理系统之初犯下的理念性错误。

Python的包管理系统与Yum非常类似,可能在设计之初就借鉴了Yum等Linux系统包管理工具的设计理念,这导致了Python包管理系统存在一个先天缺陷:同一软件包只允许存在一个版本,这给Python后来的发展制造了麻烦。

操作系统的软件环境通常是比较稳定和单一的,特别是服务器。对于操作系统而言,一个软件包只安装一个版本是很常见的,在操作系统层面上,需要安装和使用同一软件包的多个版本的情况并不常见,一般在安装或升级了高版本后,利用高版本对低版本的向下兼容,都可以很好的化解,这也是为什么这么年Yum一类的包管理工具能一直在Linux系统上稳稳地占据着位置的原因。

但是,使用编程语言开发项目时对依赖包的管理与操作系统的包依赖管理是有很大差异的,最大的区别在于:在一个本地开发环境中,我们可以创建任意多的Python工程,它们对于依赖的软件包/类库都有不同的版本需求,由于Python的包管理系统对于同一软件包只允许存在一个版本,这就导致单一的Python环境(包管理器)根本不能应对多个不同的Python项目,导致所谓的:“多版本依赖困境”。

实际上,对于那些从其他编程语言转到Python的程序员来说,很容易在一开始接触Python时就意识到了这个问题,并且也很容易能看出导致这一问题的根源是什么。一个有力的参照就是Java中的Maven,Maven只在操作系统上构建一个中心化的Repo(存放依赖包的目录),所有的Java项目都通过Maven的中心仓库找到自已依赖的Jar包,Maven可以轻松应对不同Java项目对同一Jar包不同版本的依赖需求,而做法也非常简单,就是每一个版本单独存放一份,允许多版本共存(Maven通过POM中的groupId -> artifactId -> version构建了一套严格的Jar包坐标体系,既确保了Jar包在版本级别上的唯一性又能快速定位Jar包位置)。另人遗憾的是,Python的包管理系统没有这样设计(应该是当时没有成熟的参考,实际上Maven的处理方式可以算是编程语言在包依赖管理上的“设计模式”了,设计理念是通用的),所以才有了后来Python自己的解决方案:虚拟环境。


关联阅读

virtualenv系列 (1) · 导致Python多版本依赖困境的根源
virtualenv系列 (2) · 系统环境与虚拟环境
virtualenv系列 (3) · 创建虚拟环境
virtualenv系列 (4) · 统一管理虚拟环境
virtualenv系列 (5) · 打通virtualenvwrapper和PyCharm/IntelliJ IDEA的虚拟环境

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laurence 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值