【问题标题】:Why do distribute and pip install to my virtualenv's ./local/bin?为什么要分发和 pip 安装到我的 virtualenv 的 ./local/bin?
【发布时间】: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_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,以防万一。

【问题讨论】:

  • 我认为 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


【解决方案1】:

我感觉 Ubuntu 的 python 包中存在错误或在某处分发……但我还没有找到它(我不确定我是否关心)。

无论出于何种原因,VIRTUAL_ENV 环境变量都需要设置为 virtualenv 的根目录,以便分发和 pip 正确安装。

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

【讨论】:

  • 已确认:将 VIRTUAL_ENV 设置为 virtualenv 的根目录将导致 pip 和分发正确安装。我已经在 Ubuntu 13.04 上对此进行了测试。谢谢!
【解决方案2】:

它在 python 文档中。

'/usr/local' 是默认的exec_prefix。阅读venv docs 了解如何更改默认行为的详细信息。那里甚至还有一个示例展示了如何制作一个 venv.EnvBuilder 来为您安装分发和 pip。

如果您发现分发文档,请告诉我 ;-)

【讨论】:

  • 很好的信息,谢谢。当我的 venv 被激活时,sys.prefixsys.exec_prefix 都指向 venv 的根。但我看不到文档中的何处解释了如何让pipeasy_install 使用venv。具体来说,我正在查看 venv 文档的第一个“注释”部分,这似乎告诉我,鉴于我上面的重现步骤,事情应该可以正常工作。具体来说:“当然,您需要先将它们安装到 venv 中:这可以通过在 venv 激活的情况下运行 deploy_setup.py 来完成,然后运行 ​​easy_install pip。”有什么想法吗?
【解决方案3】:

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

 unset PYTHON_PATH

【讨论】:

  • 如果您可以将此扩展到问题所在以及您的解决方案为何有效,那就更好了。
  • 我得到了同样的错误..但是当我在这个文件的顶部添加这个时,这解决了我的问题......试试吧..
  • 这对我不起作用。我的 env/bin/activate 也没有 #!作为它的第一行。正如我在上面的评论中提到的,我通过编辑 env/bin/activate 有自己的解决方法,但我正在尝试确定为什么甚至需要解决方法。
猜你喜欢
  • 1970-01-01
  • 2015-05-15
  • 2012-05-05
  • 2015-11-18
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多