我如何让virtualenv更喜欢本地库而不是全局库

时间:2011-06-28 16:43:49

标签: python virtualenv

我需要在没有root访问权限的大型服务器上使用python。我想使用比在机器上全局安装的numpy更新版本的numpy。 virtualenv完全是为此目的而设计的,我创建了我的虚拟环境并使用以下命令激活它:

virtualenv my_personal_python
source my_personal_python/bin/activate

然后我使用

安装我感兴趣的库的新版本
pip install numpy==1.6.0

问题在于,当我现在导入numpy时,它仍会导入过时的全局版本,而不是虚拟环境的my_personal_python/lib/python2.6/site-packacges目录中的一个安装。

我已经知道一种可能的解决方案,即--no-site-packages标志,如:

virtualenv --no-site-packages my_personal_python

当我使用这个标志时,导入就像我想要的那样。但是我不想使用这个标志,因为我不想在本地重新安装所有软件包,我只是想覆盖它们中的几个。

(我正在使用python 2.6,virtualenv 1.6.1,我的机器上的PYTHONPATH变量未设置。)

更新即使我将site-packages目录从虚拟环境添加到python路径的开头,也不会从该位置导入numpy(尽管从该位置导入了其他包) 。也许这个问题特定于numpy,一般情况下不会发生。

3 个答案:

答案 0 :(得分:8)

仔细检查一下。

which python

which pip

现在你确定你正在运行正确的,启动python并:

import sys
print "\n".join(sys.path)

然后退出python并输入echo $PATH,然后输入echo $PYTHONPATH 我怀疑问题是可见的,如果您无法通过设置PYTHONPATH来解决问题,那么您可以使用site模块进行修复。

答案 1 :(得分:4)

这对我有用。

我的which pythonwhich pip完全正确,但sys.path错了。我的virtualenv在~/virtualenvs/envy。最初我在做:

export PYTHONPATH=~/virtualenvs/envy/lib/python2.7/site-packages:$PYTHONPATH

但这仍然是导入系统范围的软件包而不是我的virtualenv软件包。但我看了this PyCon talk on virtualenv并决定尝试:

export PYTHONPATH=~/virtualenvs/envy/lib/python2.7:$PYTHONPATH

请注意第二个选项中缺少site-packages。这实际上有效!我希望它可以帮助别人。

答案 2 :(得分:2)

这个问题的另一个解决方案(至少对我有帮助):在我的~/.local/lib/python2.7/site-packages/easy-install.pth中,有一些(IMHO不必要的)行,如/usr/lib/python2.7/dist-packages。删除这些行有帮助,也许它们在很久以前就已经遗留下来了,当时easy_install仍然做了一些陌生的事情。