virtualenv 不包含 pip

virtualenv does not include pip

我正在尝试在 Mac OS X El Capitan 上使用 virtualenv 创建虚拟环境。我已经安装了 Python 2.7.11 和 brew,默认情况下包括 pipwheelsetuptools

然而,当我尝试按照 documentation 或任何其他资源中的说明安装 virtualenv 时,我遇到了几个问题:

  1. virtualenv 可执行文件在 pip 完成后没有放在 /usr/local/bin 中,所以我需要手动 ln -s 它(这可能表明,有这一步安装有问题)。
  2. 在我 运行 virtualenv venv 之后,它创建了新的环境,从 brew 安装中捕获了 Python 2.7.11,但是: bin 文件夹 中没有 pip。这意味着,如果我尝试 which pip,激活 venv,它 returns 全局位置 pip/usr/local/bin/pip,而不是 /path/to/venv/bin/pip

因此,在 venv 中安装软件包使用全局 pip 并将它们安装到全局 sites-packages,而不是在 venv 中,这恰恰相反环境应该做什么。

能否请您提出可能存在的问题以及如何解决?

编辑:值得一提的是,我曾经在我的计算机上安装了其他版本的 Python,我最近删除了 in this answer 中描述的这些版本。可能是它导致了问题,需要进行更彻底的清洁。

  1. virtualenv executable is not placed in /usr/local/bin after pip makes its job, so I need to ln -s it by hand (it may indicate, that there is something wrong with installation on this step).

不要那样做。那只会隐藏错误并不能解决问题。以下是如何调试此类问题的简短指南:

  • which -a python 开始。您看到的第一个路径应该是 /usr/local/bin/python,如果不是请检查您的 PATH 变量。

  • 接下来,检查which -a pip。同样,第一个路径应该是 /usr/local/bin/pip。如果不是,运行 python -m ensurepip 并重新检查。

  • 现在使用 pip install virtualenv 安装 virtualenv,然后检查 which -a virtualenv 的输出。第一个路径应该是 /usr/local/bin/virtualenv,如果不是,请检查 env |grep PYTHON 的输出是否有意外的环境变量。

  • 最后检查 virtualenv --version 的输出以确保您拥有最新版本。

尝试删除或重命名主目录中的 .pydistutils.cfg 文件,例如通过使用 mv ~/.pydistutils.cfg ~/oldpydistutils.cfg

重命名

我在这里给出一个详细的答案是为了帮助其他人,但最初的功劳归于 this answer。如果您知道 .pydistutils.cfg 中具体是什么导致了问题,请告诉我!

我遇到了同样的问题:我的虚拟环境是在没有 pip 本地副本的情况下创建的,尽管它们有 python 的本地副本。这意味着从安装到全局包位置的虚拟环境中使用 $ pip,并且对环境的 python 不可见。

我是如何在我的机器上诊断这个的:

  1. 我用 $ virtualenv env
  2. 创建了一个虚拟环境
  3. 激活虚拟环境 $ source env/bin/activate
  4. 检查 python 位置:运行 (env)$ which python 输出 /Users/<username>/env/bin/python(如预期)
  5. 已检查点位置:运行 (env)$ which pip 输出 /usr/local/bin/pip(不期望)

要检查我们的包去哪里了,我们可以尝试在虚拟环境中安装一个包:

  1. 尝试安装包:(env)$ pip install HTTPServer 成功
  2. 尝试 运行 包:(env)$ python -m HTTPServer 失败并出现错误 /Users/emunsing/env/bin/python: No module named HTTPServer
  3. 要仔细检查,请再次尝试安装:(env)$ pip install HTTPServer 生成 Requirement already satisfied (use --upgrade to upgrade): HTTPServer in /usr/local/lib/python2.7/site-packages

仔细检查,我们发现环境的 /bin 文件夹中没有 Pip:

$ ls env/bin activate activate.fish python python2 activate.csh activate_this.py python-config python2.7

所以当系统找到本地python版本时,它找不到本地pip可以使用并遍历$PATH。它最终使用了来自 /usr/local/bin 的 pip,让我无法在本地将软件包安装到虚拟环境。

这是我尝试过的: - 重新安装 python brew uninstall python 然后 brew upgradebrew install python --build-from-source - 安装 pip using the get-pip.py command as described in the Pip documentation

以下是我排除的情况: - 我没有使用 sudo pip ... which caused similar problems in this other question 也没有在这个 Python/pip 安装中使用过 - 我的虚拟环境没有显示 pip 的本地安装,就像这些类似问题中的情况一样:This one for Windows, This one for Mac OS X.

最终,我发现删除 ~/.pydistutils.cfg 文件可以解决问题,允许新的虚拟环境拥有自己的本地 pip。我的 ~/.pydistutils.cfg 文件的内容是:

[global]
verbose=1

[install]
install-scripts=$HOME/bin

[easy_install]
install-scripts=$HOME/bin

简单地重命名 ~/.pydistutils.cfg 文件似乎可以解决问题:尽管这个文件似乎是由自制程序安装创建的,some settings in this file may be incompatible with virtualenv. While removing this file hasn't had any bad effects on my system, you may need to use the --user flag when installing packages with pip to the global environment (e.g. $ pip install --user HTTPServer). Here are more details on .pydistutils.cfg 如果您想根据自己的需要对其进行定制。

我在 运行 virtualenv 时遇到了问题:"ImportError: No module named pip." 我的解决方案是降级 virtualenv。我有 16.2.0。 pip 卸载 virtualenv pip 安装 virtualenv==15.1.0