如何让virtualenv优先使用本地库而非全局库
我需要在一个大服务器上使用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 个回答
还有一个解决这个问题的方法(至少对我有帮助):在我的 ~/.local/lib/python2.7/site-packages/easy-install.pth
文件里,有一些我认为不必要的内容,比如 /usr/lib/python2.7/dist-packages
。把这些内容删掉后问题就解决了,可能是以前的版本留下来的,那时候 easy_install 还做过一些奇怪的事情。
这对我有效。
我的 which python
和 which 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
。结果真的有效!希望这能帮到其他人。
先确认几个事情。
which python
which pip
确保你正在使用正确的版本后,启动 Python,然后:
import sys
print "\n".join(sys.path)
接着退出 Python,输入 echo $PATH
,再输入 echo $PYTHONPATH
。
我怀疑问题会在这里显现出来。如果你通过设置 PYTHONPATH
不能解决问题,那么你可能可以通过 site
模块来解决。