如何让virtualenv优先使用本地库而非全局库

27 投票
3 回答
17019 浏览
提问于 2025-04-16 20:28

我需要在一个大服务器上使用Python,但我没有管理员权限。我想用一个比机器上全局安装的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 个回答

2

还有一个解决这个问题的方法(至少对我有帮助):在我的 ~/.local/lib/python2.7/site-packages/easy-install.pth 文件里,有一些我认为不必要的内容,比如 /usr/lib/python2.7/dist-packages。把这些内容删掉后问题就解决了,可能是以前的版本留下来的,那时候 easy_install 还做过一些奇怪的事情。

4

这对我有效。

我的 which pythonwhich pip 命令都没问题,但 sys.path 出了错。我的虚拟环境在 ~/virtualenvs/envy 里。最开始我使用的是:

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

但这样还是在导入系统全局的包,而不是我虚拟环境里的包。不过我看了这场关于虚拟环境的PyCon演讲,然后决定尝试:

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

注意第二种方法里没有 site-packages。结果真的有效!希望这能帮到其他人。

9

先确认几个事情。

which python

which pip

确保你正在使用正确的版本后,启动 Python,然后:

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

接着退出 Python,输入 echo $PATH,再输入 echo $PYTHONPATH

我怀疑问题会在这里显现出来。如果你通过设置 PYTHONPATH 不能解决问题,那么你可能可以通过 site 模块来解决。

撰写回答