【发布时间】:2013-02-28 12:50:55
【问题描述】:
我使用 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_install 和pip 会使用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,以防万一。
【问题讨论】:
-
我认为 virtualenv 应该已经包含
pip/easy_install了? -
奇数。我在 Debian 上使用个人构建的 Python 3.3,并为我在
env/bin中分发/pip 安装。您的 3.3 副本是否来自 Ubuntu 存储库?如果是,请尝试构建本地副本,看看是否正常工作。 -
@MattDMo 我相信当您使用
virtualenv命令时,pip 和easy_install 都包含在内,但从文档来看,Python 3.3 的 venv 模块似乎并非如此。 @eryksun 这确实是 Ubuntu 的 Python 3.3 版本。我会尝试在本地构建并报告。 -
在从源代码构建 Python 3.3 后,我无法重复上述步骤,但似乎使用
virtualenv env --no-site-packages --python=python2.7并使用 get-pip.py 安装pip将创建一个 env/local 目录,但在这种情况下,每个 env/local/bin env/local/include 和 env/local/lib 分别符号链接到它们的 env/bin env/include 和 env/lib。所以现在的问题是“这在 Python 3.3 中,还是在 Ubuntu 的 Python 3.3 版本中有所不同?” -
本地目录是通过修复这个bug引入的。
标签: python python-3.x virtualenv python-3.3 ubuntu-12.10