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

Python 如何让virtualenv更喜欢本地库而不是全局库,python,virtualenv,Python,Virtualenv,我需要在大型服务器上使用python,因为我没有根访问权限。我想使用比机器上全局安装的版本更新的numpy版本virtualenv正是为此而设计的,我创建了我的虚拟环境,并使用以下命令激活它: virtualenv my_personal_python source my_personal_python/bin/activate 然后安装我感兴趣的库的新版本 pip install numpy==1.6.0 问题是,当我现在导入numpy时,它仍然导入过时的全局版本,而不是安装在虚拟环境的m

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

virtualenv my_personal_python
source my_personal_python/bin/activate
然后安装我感兴趣的库的新版本

pip install numpy==1.6.0
问题是,当我现在导入numpy时,它仍然导入过时的全局版本,而不是安装在虚拟环境的
my_personal\u 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特有的,并且通常不会在包中出现。

请仔细检查一些事项

哪个python

哪个pip

现在您已经确定运行的是正确的,请启动python并执行以下操作:

import sys
print "\n".join(sys.path)
然后退出python并键入
echo$PATH
,然后键入
echo$PYTHONPATH
我怀疑这个问题将是可见的,如果您无法通过设置
PYTHONPATH
来解决它,那么您可能可以使用
站点
模块来解决它。

这对我很有效

我的
哪个python
哪个pip
是完全正确的,但是
sys.path
是错误的。我的virtualenv在
~/virtualenvs/envy
中。最初我在做:

export PYTHONPATH=~/virtualenvs/envy/lib/python2.7/site-packages:$PYTHONPATH
但这仍然是导入系统范围的包,而不是我的virtualenv包。但我看了之后决定试试:

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

请注意,第二个选项中缺少
站点包
。这确实奏效了!我希望它能帮助其他人。

这个问题的另一个解决方案(至少对我有帮助):在我的
~/.local/lib/python2.7/site-packages/easy-install.pth
中,有一些(不必要的)行,如
/usr/lib/python2.7/dist-packages
。删除这些线路很有帮助,可能它们是从更古老的时代遗留下来的,当时easy_install仍在做一些奇怪的事情。

好吧,它应该能像您预期的那样工作。可能是旧版本的VirtualEnvironment中的一个bug,可能安装在那台计算机上……不确定这是否是问题所在,但pip知道使用激活的虚拟环境吗?检查并查看全局site-packages中是否安装了numpy 1.6.0。pip确实知道如何使用虚拟环境,并且已将版本1.6.0正确安装到虚拟环境的site-packages目录中。“numpy的全局版本是1.4.0。@康拉德利,两年后也遇到了同样的问题。解决方案是什么???2015年这里也是一样。我的virtualenv路径比
sys.path()
中的
/usr/lib/python2.7/dist包要晚得多。有没有一个解决方案,因为它不涉及更改代码?