PEP 297 – 系统升级支持
- 作者:
- Marc-André Lemburg <mal at lemburg.com>
- 状态:
- 已拒绝
- 类型:
- 标准轨迹
- 创建:
- 2001年7月19日
- Python 版本:
- 2.6
- 历史记录:
拒绝通知
由于未能引起足够的关注,此 PEP 被拒绝。
摘要
此 PEP 提出了一些策略,允许分部分升级 Python 标准库,而无需重新安装整个发行版或等待新的补丁级别版本。
问题
Python 目前默认情况下不允许覆盖标准库中的模块或包。即使可以通过定义 PYTHONPATH
环境变量来实现(此变量中定义的路径将预置到 Python 标准库路径),但如果没有更改配置,就没有标准方法可以实现这一点。
由于 Python 的标准库开始托管也单独提供的包,例如 distutils、email 和 PyXML 包,这些包也可以独立于 Python 发行版安装,因此希望能够选择升级这些包,而无需等待 Python 解释器的新的补丁级别版本才能带来更改。
在某些情况下,可能还需要更新标准库的模块,而无需经过整个 Python 发布周期,例如为了提供安全问题的热修复。
提出的解决方案
此 PEP 提出两种不同但未必冲突的解决方案
- 向
sys.path
添加新的标准搜索路径:$stdlibpath/system-packages
,紧接在$stdlibpath
条目之前。这补充了现有的站点附加组件条目$stdlibpath/site-packages
,该条目在解释器启动时附加到sys.path
。为了利用这个新的标准位置,distutils 将需要增加对将某些包安装到
$stdlibpath/system-packages
而不是第三方包的标准位置$stdlibpath/site-packages
的支持。 - 调整 distutils 以直接安装到
$stdlibpath
以进行系统升级,而不是安装到$stdlibpath/site-packages
。
第一个解决方案比第二个解决方案有一些优势
- 升级很容易识别(只需查看
$stdlibpath/system-packages
) - 可以卸载升级而不会影响解释器的其余安装
- 可以从包中虚拟删除模块;这是由于 Python 导入包的方式:一旦找到顶级包目录,它就会停留在该目录中以进行所有后续的包子模块导入
- 与在现有安装之上进行的 hackish 安装方法相比,这种方法总体设计更简洁
第二种方法的唯一优势是 Python 解释器不需要更改,并且它适用于旧版本的 Python。
两种解决方案都需要对 distutils 进行更改。这些更改也可以由包作者实施,但最好定义一种标准方法来打开建议的行为。
范围
解决方案 1:Python 2.6 及更高版本
解决方案 2:distutils 支持的所有 Python 版本
鸣谢
无
参考文献
无
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0297.rst
上次修改时间:2023-09-09 17:39:29 GMT