【问题标题】:In a python environment, how to import a package from a specific version?在python环境中,如何从特定版本导入包?
【发布时间】:2019-09-07 21:32:01
【问题描述】:

这不是问题的重复:

Import python packages with different versions installed

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 的新路径导入。

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

【问题讨论】:

  • 我会继续问,Assuming we have full access over the sourcecode of packages 'program', 'feature_A', and 'feature_B'... 如果是这种情况,为什么不重组你的代码让你的生活更轻松? (例如,from library.v1 import func as funcv1;from library.v2 import func as funcv2 ?)
  • 好的,看来您没有可以控制library,对吧?我的误解。
  • 您也可以在加载特定功能时尝试模拟导入。

标签: python dependency-management package-managers


【解决方案1】:

我会在不同的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)

【讨论】:

  • 非常感谢您的想法!但是 sys.path 是进程全局的,如果 2 个导入几乎同时在 2 个线程中发生怎么办?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    安装特定版本

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

    pip install requests==2.18.4

    要安装最新的 2.x 版本的请求:

    pip install requests>=2.0.0,<3.0.0

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

    pip install --pre requests

    【讨论】:

      【解决方案4】:

      python pkg_resources 可以帮助你。

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

      【讨论】:

        猜你喜欢
        • 2023-01-02
        • 1970-01-01
        • 2015-01-08
        • 1970-01-01
        • 1970-01-01
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多