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

时间:2019-09-07 21:32:01

标签: python dependency-management package-managers

这不是问题的重复项:

Import python packages with different versions installed

也不能通过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的新路径中导入。

现在我的问题是:完全自动化此过程有多困难?是否需要弱人工智能?还是可以使用纯功能逻辑来完成?

4 个答案:

答案 0 :(得分:1)

我会在不同的count += 1中安装不同的软件包版本,例如

print(f"i = {i}")

print(f"j = {j}")

,对于要在其他路径PYTHONPATH中安装的软件包的其他版本,则相同。在不同PYTHONPATH=insertherepath1 ; python setup.py install --prefix=insertherepath1 中的两个安装仍然可以访问主python路径中的其他常用安装软件包。

要使用PYTHONPATH=insertherepath1 ; pip install --install-option="--prefix=insertherepath1" package==v1 中的不同软件包:

insertherepath2

并等效使用其他版本:

PYTHONPATH

答案 1 :(得分:1)

我自己还没有遇到这种情况。我的建议是重命名库,以便它们以不同的名称安装。在我看来,这似乎是最简单的方法。

答案 2 :(得分:0)

安装特定版本

pip允许您使用版本说明符指定要安装的软件包版本。例如,要安装特定版本的请求:

pip install requests==2.18.4

要安装最新的2.x版本的请求,请执行以下操作:

pip install requests>=2.0.0,<3.0.0

要安装软件包的预发行版本,请使用--pre标志:

pip install --pre requests

答案 3 :(得分:0)

python pkg_resources可能会帮助您。

https://setuptools.readthedocs.io/en/latest/pkg_resources.html#workingset-objects