为什么 distribute 和 pip 安装在我的虚拟环境 ./local/bin?

25 投票
3 回答
2842 浏览
提问于 2025-04-17 18:51

我使用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_installpip使用虚拟环境中的副本,并且用它们来安装包时会把包放到虚拟环境里。

进一步查看,我打开了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 个回答

0

我也遇到过同样的问题。在 activate 脚本文件中,我需要在第一行添加一些内容(当然是在 #!... 之后):

 unset PYTHON_PATH
1

这在Python的文档里有说明。

‘/usr/local’是默认的 exec_prefix。你可以查看 venv的文档,了解如何更改默认设置。文档里还有一个例子,教你如何创建一个 venv.EnvBuilder,它会帮你自动安装distribute和pip。

如果你找到distribute的文档,请告诉我哦 ;-)

2

我感觉在Ubuntu的Python包或者分发工具中可能有个bug……不过我还没找到具体问题(而且我也不太想去找)。

不管是什么原因,VIRTUAL_ENV这个环境变量需要设置为虚拟环境的根目录,这样distribute和pip才能正常安装。

这个链接是从Python 3文档中Vinay Sajip的代码示例改编而来的,它设置了这个变量;使用它的话,distribute和pip就能正常安装了。

撰写回答