首页 > 解决方案 > 在 python 环境中,如何从特定版本导入包?

问题描述

这不是问题的重复:

导入安装了不同版本的python包

virtualenv/pipenv 也无法解决:共享相同名称/路径但具有不同代码/版本的软件包必须安装在同一环境下才能使程序正常运行

考虑以下经典的菱形依赖问题:

假设我们可以完全访问包“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

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

标签: pythondependency-managementpackage-managers

解决方案


我会以不同的方式安装不同的软件包版本PYTHONPATH,例如

PYTHONPATH=insertherepath1 ; python setup.py install --prefix=insertherepath1

或者

PYTHONPATH=insertherepath1 ; pip install --install-option="--prefix=insertherepath1" package==v1

对于要安装在另一个路径中的其他版本的软件包也是如此insertherepath2。不同PYTHONPATHs中的两个安装仍然可以访问主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)

推荐阅读