为什么 distribute 和 pip 安装在我的虚拟环境 ./local/bin?
我使用Python 3.3自带的方法创建并激活了一个虚拟环境(venv):
$ python3.3 -m venv env
$ source env/bin/activate
此时,python
指的是我虚拟环境中的Python,这是我所期望的:
(env) $ which python
/my_home_directory/env/bin/python
现在我想安装distribute和pip,所以我下载了安装脚本并运行它们:
(env)$ wget http://python-distribute.org/distribute_setup.py
(env)$ wget https://raw.github.com/pypa/pip/master/contrib/get-pip.py
(env)$ python distribute_setup.py
(env)$ python get-pip.py
这些命令成功完成。此时我检查我的虚拟环境,发现多了一个叫“local”的目录,这个目录之前是没有的。env/local/bin里面有我的easy_install和pip可执行文件,但它们仍然指向我系统中已有的easy_install和pip:
(env)$ ls env
bin include lib local pyvenv.cfg
(env)$ ls env/bin
activate pydoc python python3 python3.3
(env)$ ls env/local/bin
easy_install easy_install-3.3 pip pip-3.3
(env)$ which easy_install
/usr/bin/easy_install
(env)$ which pip
/usr/bin/pip
我认为这和Python 2.x的行为有所不同。此时我期望easy_install
和pip
使用虚拟环境中的副本,并且用它们来安装包时会把包放到虚拟环境里。
进一步查看,我打开了env/bin/activate,发现env/bin被添加到了系统路径的最前面,但env/local/bin没有。这就解释了我看到的行为。我可以通过编辑env/bin/activate来解决这个问题,把env/local/bin目录添加到路径中,类似于:
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
PATH="$VIRTUAL_ENV/local/bin:$PATH" # my new line
export PATH
那么,这到底是怎么回事呢?这是个bug,还是我漏掉了什么?
我在使用Ubuntu 12.10,看看这是否有影响。
3 个回答
我也遇到过同样的问题。在 activate
脚本文件中,我需要在第一行添加一些内容(当然是在 #!...
之后):
unset PYTHON_PATH
这在Python的文档里有说明。
‘/usr/local’是默认的 exec_prefix。你可以查看 venv的文档,了解如何更改默认设置。文档里还有一个例子,教你如何创建一个 venv.EnvBuilder
,它会帮你自动安装distribute和pip。
如果你找到distribute的文档,请告诉我哦 ;-)
我感觉在Ubuntu的Python包或者分发工具中可能有个bug……不过我还没找到具体问题(而且我也不太想去找)。
不管是什么原因,VIRTUAL_ENV这个环境变量需要设置为虚拟环境的根目录,这样distribute和pip才能正常安装。
这个链接是从Python 3文档中Vinay Sajip的代码示例改编而来的,它设置了这个变量;使用它的话,distribute和pip就能正常安装了。