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的源代码。应该可以做以下事情:
摄取 和 的包源/字节码,
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
s中的两个安装仍然可以访问主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)
推荐阅读
- angular - Angular 2 - Favicons Webpack 插件在许多文件中注入 html
- amazon-web-services - Amazon Athena 中的 HIVE_INVALID_METADATA
- google-apps-script - 在公式中输入中断
- corda - 在 cordapp api/flow 中通过唯一 ID 查找状态
- cygwin - 如何使用cygwin监控java进程
- qt - 如何使用 CMake 从 qmake 建模 OTHER_FILES?
- java - Java Hashset 基于值而不是哈希码存储项目
- python-3.x - 无法使用 selenium 和 python 找到引用的 ID
- ios - SegmentControl 在 UITableviewCell 上复制复选标记
- swift - 修改 UI 后无法触发 UIButton 的操作