这不是问题的重复:
导入安装了不同版本的 python 包
virtualenv/pipenv也无法解决:共享相同名称/路径但具有不同代码/版本的软件包必须安装在相同的环境中,程序才能正常运行。
考虑以下经典的钻石依赖问题:
- 程序 <- feature_A <- 库 (v 1.0(
- 程序 <- feature_B <- 库 (V 2.0(
假设我们对软件包'program'、'feature_A'和'feature_B'的源代码具有完全访问权限,并且feature_A和feature_B都有以下代码:
import library.*
在像virtualenv,pip和conda这样的传统包管理器中,上述情况将阻止feature_A和feature_B在同一项目中使用。但是由于python是一种解释性语言,我们可以使用feature_A和feature_B的源代码。应该可以执行以下操作:
摄取
library (v1.0)
和library (v2.0)
的包源/字节代码,为每个加密哈希生成 2 个加密哈希,并将它们安装在 2 个不同的路径下,具体取决于它们各自的哈希。使用代码生成器重写
feature_A
并feature_B
以便它们从依赖于加密哈希的新路径导入,并安装重写的版本。使用代码生成器重写
program
以便它从安装了重写feature_A
和feature_B
的新路径导入。
现在我的问题是:完全自动化这个过程有多难?是否需要弱人工智能?或者可以使用纯函数逻辑来完成?
我会在不同的PYTHONPATH
中安装不同的软件包版本,例如
PYTHONPATH=insertherepath1 ; python setup.py install --prefix=insertherepath1
或
PYTHONPATH=insertherepath1 ; pip install --install-option="--prefix=insertherepath1" package==v1
对于要安装在另一个路径中的软件包的其他版本也是如此insertherepath2
.不同PYTHONPATH
中的两个安装仍然可以访问主 python 路径中其他常用安装的包。
要使用python
中的不同软件包:
import sys
sys.path.insert(0, 'insertherepath1')
import package #gets version 1
#maybe (depends on further dependencies) : sys.path.pop(0)
等效地使用其他版本:
import sys
sys.path.insert(0, 'insertherepath2')
import package #gets version 2
#maybe (depends on further dependencies) : sys.path.pop(0)
我自己还没有遇到过这种情况。 我的建议是重命名库,以便它们以不同的名称安装。 对我来说,这似乎是最简单的方法。
安装特定版本
pip 允许您使用版本说明符指定要安装的软件包版本。例如,要安装特定版本的请求,请执行以下操作:
pip install requests==2.18.4
要安装最新的 2.x 版本的请求,请执行以下操作:
pip install requests>=2.0.0,<3.0.0
要安装软件包的预发布版本,请使用 --pre 标志:
pip install --pre requests
python pkg_resources可能会帮助你。
https://setuptools.readthedocs.io/en/latest/pkg_resources.html#workingset-objects