在python环境中,如何从特定版本导入包?



这不是问题的重复:

导入安装了不同版本的 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的源代码。应该可以执行以下操作:

  1. 摄取library (v1.0)library (v2.0)的包源/字节代码,为每个加密哈希生成 2 个加密哈希,并将它们安装在 2 个不同的路径下,具体取决于它们各自的哈希。

  2. 使用代码生成器重写feature_Afeature_B以便它们从依赖于加密哈希的新路径导入,并安装重写的版本。

  3. 使用代码生成器重写program以便它从安装了重写feature_Afeature_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

相关内容

  • 没有找到相关文章

最新更新