在我的申请中,我想使用:
packageA
,需要packageX==1.3
packageB
,需要packageX==1.4
packageX==1.5
如何使用pip安装packageX
的多个版本来处理这种情况?
答案 0 :(得分:38)
pip对此没有帮助。
您可以告诉它安装特定版本,但它会覆盖另一个版本。另一方面,使用两个virtualenvs可以让你在同一台机器上安装这两个版本,但不能同时使用它们。
最好的办法是手动安装这两个版本,方法是将它们放在带有不同名称的Python路径中。
但如果你的两个lib期望它们具有相同的名称(它们应该),你将不得不修改它们,以便它们通过一些导入别名来获取它们所需的版本,例如:
import dependencyname_version as dependencyname
目前还没有干净的方法来做到这一点。你希望最好的办法就是让这个黑客工作。
我宁愿放弃两个lib中的一个并用等效的替换它,或者修补它以接受新版本的依赖项并将补丁返回给社区。 p>
答案 1 :(得分:9)
下载ea的来源。包。将每个安装在自己的单独文件夹中。例如。我有1.10版本的软件包,但是想要切换到dev版本进行一些工作。我下载了dev模块的源代码:
git clone https://github.com/networkx/networkx.git
cd netowkrx
我为这个版本创建了一个文件夹:
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 :(得分:1)
一个丑陋的解决方法是我在 Blender 中使用 python 安装(并远离路径)一个类似版本的 python 并使用子进程让另一个版本完成所需的工作。如果你做的不仅仅是安装 pandas 和 scipy,Blender python 往往会变得有点脾气暴躁。我已经尝试过将 virtualenvs 与 Blender 一起使用,但这往往会破坏事情。
另外,如果您使用 Blender 进行数据可视化,您将需要将一个 config 文件夹添加到您的版本号文件夹中,这会将您的所有插件保存在该文件夹中,并使其更加便携和不太可能弄乱其他搅拌机的安装。许多为 Blender 制作插件的人不是“程序员”,所以那些精明的人通常会做一些非常黑客的事情,这是我能够使用的最好的解决方法。
另一种解决方法(这有很多标志,它应该使我无法触摸键盘)是手动定位 init 文件并使用 importlib 手动将其添加到全局变量中...这伴随着风险。当你这样做时,一些模块会正常运行,其他模块会抛出可能导致额外特殊故障排除会话的废话。保持它喜欢的版本,它确实减少了问题,我很幸运使用它从虚拟环境后面导入模数,但是我在使用 Blender 的 python 时使用子进程调用是有原因的。< /p>
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