【问题标题】:Deal with several package versions in python virtualenv在 python virtualenv 中处理几个包版本
【发布时间】:2014-08-19 10:13:18
【问题描述】:

我正在使用一个没有 root 权限的计算服务器,所以为了能够安装我想要的任何库,我为 python 2.6 创建了一个 virtualenv--system-site-packages

然后,在虚拟环境中,我安装了 numpy 版本 1.8.2,因为系统 numpy 版本(1.3.0)对于我的要求来说太旧了:

numpy - 1.3.0 - 积极开发 (/usr/lib64/python2.6/site-packages)

numpy - 1.8.2 - 非活动

我需要--system-site-packages 选项,因为我正在使用一些无法在虚拟环境中安装的系统库。但是我无法告诉虚拟环境使用最新版本的 numpy。

有谁知道如何在虚拟环境中选择1.8.2版本?我尝试使用pkg_resources.require('numpy==1.8.2'),但出现错误:

pkg_resources.VersionConflict: (numpy 1.3.0 (/usr/lib64/python2.6/site-packages), Requirement.parse('numpy==1.8.2'))

有没有办法让虚拟环境先在虚拟的virt2/lib64/python2.6/site-packages 文件夹中查找库,然后再查看系统的/usr/lib64/python2.6/site-packages 文件夹?

【问题讨论】:

  • 可以使用pip,我不确定pkg_resources,*.com/questions/12079607/…
  • 你到底是如何在你的 virtualenv 中安装 numpy 的?您应该能够~$ pip install -I numpy==1.8.2(可能需要-I 来告诉pip 忽略已安装的系统范围的numpy)。当你从你的 virtualenv 中调用 ~$ python -c "import numpy; print numpy.__version__, numpy.__file__" 时,你会得到什么输出?

标签: python numpy virtualenv


【解决方案1】:

你很可能已经被issue #461 咬了,目前(截至 2014 年 8 月)你不能升级任何系统继承的包,因为virtualenv 的路径是在sys.path 中的任何系统路径之后排序的.

您的解决方法是将(通常)最后一个系统路径条目移动到上方一个位置:

  • 用python-code重新排序sys.path,例如,假设你的virtualenv的site-packages的索引是最后一个,你必须确保以下代码在任何其他代码之前运行:

    import sys; sys.path.insert(0, sys.path.pop(-1))
    
  • 在执行 python-interpreter 之前类似地修改您的 PYTHONPATH 环境变量(请参阅 question #10738919 和 )。

【讨论】:

    最近更新 更多