使用pip安装软件包的多个版本


83

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

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

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


2
将软件包安装到非标准位置,然后使用PYTHONPATH确定要导入的软件包;看到这个答案
Yibo Yang

1
附带说明一下,此问题中的场景以及当前接受的答案中的hacky解决方案都是一个很好的例子,说明了为什么程序包所有者不应该也不要挑剔以固定其依赖关系的确切版本。他们应该一直在使用packageX>=1.3,<2packageX>=1.4,<2(假设上游packageX正在遵循语义版本控制),那么作为下游应用程序开发人员,您将没有任何问题可以固定和使用,packageX==1.5并且每个人都会很高兴。更多详细信息
-RayLuo,

Answers:


63

点不会帮助您。

您可以告诉它安装特定版本,但是它将覆盖另一个版本。另一方面,使用两个virtualenvs将使您在同一台计算机上安装两个版本,但不能同时使用它们。

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

但是,如果您的两个库期望它们具有相同的名称(并且应该相同),则必须对其进行修改,以便它们使用一些导入别名来选择所需的版本,例如:

import dependencyname_version as dependencyname

当前尚无干净的方法来执行此操作。您所希望的最好的办法就是使这种黑客能够正常工作。

我宁愿放弃两个库之一,而用一个等效库替换它,或者修补它以接受新版本的依赖项并将修补程序返回给社区。


41
仍然没有解决办法吗?
哈肯·里德(HåkenLid)

2
还是没有解决办法?
AjaxLeung

1
如此多的语言都存在这个问题... Java,Go,Haxe ...希望语言设计人员将放弃全局包名称空间,并在他们创建的未来语言中采用更多类似于Node.js的模块系统,因为Node.js支持多种版本的依赖性。
安迪

15

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

现在,由于我的PYTHONPATH现在指向此其他site-packages文件夹,因此当我在命令行上运行python并导入新模块时,它就可以工作了。要切换回去,请从PYTHONPATH中删除新文件夹。

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

2
嗯,之所以来到这里,是因为我正在努力解决networkx版本差异!
dwanderson '19

“要切换回去,请从PYTHONPATH中删除新文件夹。”,即使从以下位置删除了新文件夹路径,这部分也对我不起作用sys.path
Avinash Raj
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.