【问题标题】:Installing multiple versions of a package with pip使用 pip 安装多个版本的包
【发布时间】:2011-09-28 01:50:46
【问题描述】:

在我的应用程序中我想使用:

  • packageA,需要packageX==1.3
  • packageB,需要packageX==1.4
  • packageX==1.5

如何使用 pip 安装多个版本的packageX 来处理这种情况?

【问题讨论】:

  • 将包安装到非标准位置,然后使用 PYTHONPATH 确定要导入哪一个;见this answer
  • 在旁注中,这个问题中的场景以及currently accepted answer 中的 hacky 解决方案是一个很好的例子,说明为什么包所有者不应该也不应该挑剔固定的确切版本他们的依赖。他们应该一直在使用packageX>=1.3,<2packageX>=1.4,<2(假设上游的packageX 跟随Semantic Versioning),那么作为下游应用程序开发人员的您将毫无问题地固定和使用packageX==1.5,每个人都会很高兴。 More details here
  • 嗯。可选包main_package[opt] 的新括号可能会有所帮助
  • @rayluo,真的。但是,您需要对所有这些版本进行 QA/测试......或者只是祈祷。
  • @RobertLugg,中间层库和最终应用程序之间存在差异。作为一个库,packageApackageB 不应为其依赖packageX 固定特定版本,无论它是否测试了所有packageX 版本(并且它肯定无法测试packageX==1.6 的未来版本, 1.7 等)。应用程序APP 的开发人员的工作是在测试后固定ABX 的特定组合。如果packageAB pin X 喜欢这个问题的方式,APP 的开发者连测试的机会都没有。祈祷甚至帮不了他们。

标签: python pip


【解决方案1】:

pip 不会帮您解决这个问题。

您可以告诉它安装特定版本,但它会覆盖另一个版本。另一方面,使用两个 virtualenv 可以让您在同一台机器上安装两个版本,但不能同时使用它们。

最好的办法是手动安装这两个版本,方法是将它们放在 Python 路径中并使用不同的名称。

但是,如果您的两个库希望它们具有相同的名称(并且它们应该具有相同的名称),您将不得不修改它们,以便它们使用一些导入别名来获取它们需要的版本,例如:

import dependencyname_version as dependencyname

目前没有干净的方法来做到这一点。最好的办法就是让这个 hack 发挥作用。

我宁愿放弃这两个库中的一个并将其替换为等效库,或者对其进行修补以接受新版本的依赖项并将修补程序返回给社区。​​p>

【讨论】:

  • 这个还是没有解决办法吗?
  • 还是没有解决办法?
  • 这么多语言都有这个问题...Java、Go、Haxe...希望语言设计者将放弃全局包命名空间并在他们创建的未来语言中采用更类似于 Node.js 的模块系统,因为 Node.js 支持多个版本的依赖。
  • 使用 maven 或 gradle 你可以安装同一个包的两个版本,使用 pip 你不能。你仍然不能在同一个程序中使用同一个包的两个版本。
  • 快到 2022 年仍然没有解决方案?
【解决方案2】:

下载 ea 的源代码。包裹。将每个安装在其自己的单独文件夹中。例如。我有版本 1.10 包,但想切换到开发版本进行一些工作。我下载了开发模块的源代码: git clone https://github.com/networkx/networkx.git cd netwokrx 我为此版本创建了一个文件夹: mkdir /home/username/opt/python,然后我将 PYTHONPATH 环境变量设置为:export PYTHONPATH=/home/username/opt/python/lib/python2.7/site-packages/。接下来,我安装它使用:python setup.py install --prefix=/home/username/opt/python

现在,由于我的 PYTHONPATH 现在指向另一个站点包文件夹,所以当我在命令行上运行 python 并导入新模块时,它可以工作。要切换回来,请从 PYTHONPATH 中删除新文件夹。

>>> import networkx as nx
>>> nx.__version__
'2.0.dev_20151209221101'

【讨论】:

  • 哈,专门来这里是因为我在和networkx 版本差异作斗争!
  • “要切换回来,请从 PYTHONPATH 中删除新文件夹。”,即使从 sys.path 中删除新文件夹路径,这部分对我也不起作用
【解决方案3】:

ugly 我在搅拌机中与 python 一起使用的解决方法是我将安装(并避开路径)类似版本的 python 并使用子进程让其他版本完成所需的工作。如果你做的不仅仅是安装 pandas 和 scipy,Blenders python 往往会变得有点喜怒无常。我已经尝试过将 virtualenvs 与搅拌机一起使用,但这往往会破坏事情。

另外,如果您使用搅拌机进行数据可视化,您将希望将配置文件夹添加到您的版本号文件夹中,这会将您的所有插件保留在该文件夹中,并且它使其更加便携和不太可能弄乱搅拌机的其他安装。许多为 blender 制作插件的人不是“程序员”,所以那些精明的人经常会做一些非常骇人听闻的事情,这是我能够使用的最佳解决方法。

另一种解决方法(这在游戏中有很多标志,以至于它应该取消我触摸键盘的资格)是手动找到 init 文件并使用 importlib 手动将其添加到全局...这伴随着风险。当您执行此操作时,某些模块会正常运行,而其他模块会抛出可能导致额外特殊故障排除会话的废话。让它保持喜欢的版本,它确实减少了问题,我很幸运使用它从虚拟环境后面导入模数,但我在使用搅拌机的 python 时使用子进程调用是有原因的。

def importfromfilelocation(x,y,z):
    #"""x = 'tk',y = "tkinter", z =r'C:\pyth"""
    mod_alis = x
    spec = importlib.util.spec_from_file_location(y, z)
    print(spec)
    mod_alis = importlib.util.module_from_spec(spec)
    spec.loader.exec_module(mod_alis)
    globals()[str(x)]= mod_alis

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2017-06-05
    • 2020-05-01
    相关资源
    最近更新 更多