为什么分发和pip安装到我的virtualenv的./local/bin?

时间:2013-03-12 19:54:55

标签: python python-3.x virtualenv python-3.3 ubuntu-12.10

我使用Python 3.3的内置方式创建并激活virtualenv(venv):

$ python3.3 -m venv env
$ source env/bin/activate

此时python是我的virtualenv中的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

这些命令成功完成。在这一点上,我检查我的venv,找到另一个名为“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使用virtualenv的副本,并使用它们来安装egg会将它们放入virtualenv。

进一步说,我打开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

那么,这里发生了什么?这是一个错误,还是我错过了什么?

我正在使用Ubuntu 12.10以防万一。

3 个答案:

答案 0 :(得分:2)

我感觉Ubuntu的python包中存在一个错误或者在某个地方分发......但是我没有跟踪它(我不确定我是否愿意)。

无论出于何种原因,VIRTUAL_ENV环境变量需要设置virtualenv的root用于distribute和pip才能正确安装。

This gist,从Vinay Sajip在Python 3文档中的代码示例中采用,设置了所述变量;在使用它时,distribute和pip都会正确安装。

答案 1 :(得分:1)

它在python docs中。

'/ usr / local'是默认的exec_prefix。请阅读venv docs以获取有关如何更改默认行为的详细信息。这里甚至有一个例子展示了如何制作一个venv.EnvBuilder来为你安装分发和点子。

如果您找到分发文档,请告诉我们; - )

答案 2 :(得分:0)

我遇到了同样的问题。 在activate脚本文件中,我需要添加第一行(#!...之后的cource):

 unset PYTHON_PATH