虚拟环境不包含pip。

33

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

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

  1. pip完成任务后,virtualenv可执行文件没有放置在/usr/local/bin中,因此需要手动进行符号链接(这可能表明,在此步骤中安装有问题)。
  2. 运行virtualenv venv后,它创建了一个新环境,并从brew安装中捕获了Python 2.7.11,但是:bin文件夹中没有pip。这意味着,如果我激活venv并尝试which pip,它会返回全局位置的pip —— /usr/local/bin/pip,而不是/path/to/venv/bin/pip

因此,在venv内部安装包使用全局pip,并将它们安装到全局的sites-packages中,而不是venv内部的sites-packages,这与环境所应该做的相反。

请问可能存在什么问题,以及如何解决?

编辑:需要提及的是,我曾经在计算机上安装过其他版本的Python,并且最近已经按照这个答案的描述删除了它们。也许这导致了问题,需要进行更彻底的清理。


你在安装 virtualenv 的时候使用了 sudo 命令吗?也许它以某种用户私有的方式安装,这可能会导致问题。(例如,在安装期间无法将二进制文件放置在 PATH 等位置) - millimoose
@millimoose 我尝试了带和不带 sudo 两种方式,结果都一样。这不太可能是权限问题,因为可以使用 virtualenv.py 从源代码本地安装。从tarball中使用virtualenv.py也奇怪地无法运行pip - mikeonly
5个回答

24
尝试删除或重命名主目录中的.pydistutils.cfg文件,例如使用mv ~/.pydistutils.cfg ~/oldpydistutils.cfg进行重命名。
我在这里提供了详细的答案来帮助其他人,但最初的荣誉归功于this answer。如果您知道.pydistutils.cfg中具体引起问题的内容,请告诉我!
我遇到了同样的问题:我的虚拟环境创建时没有本地的pip副本,尽管它们有本地的python副本。这意味着在虚拟环境中使用$ pip会安装到全局包位置,并且对环境的python不可见。
我如何在我的机器上诊断此问题:
1. 我使用$ virtualenv env创建了一个虚拟环境。 2. 使用$ source env/bin/activate激活虚拟环境。 3. 检查Python位置:运行命令(env)$ which python,输出结果为/Users/<username>/env/bin/python(预期结果)。 4. 检查pip位置:运行命令(env)$ which pip,输出结果为/usr/local/bin/pip(非预期结果)。
为了检查包的安装位置,我们可以尝试在虚拟环境中安装一个包:
5. 尝试安装包:(env)$ pip install HTTPServer,成功安装。 6. 尝试运行包:(env)$ python -m HTTPServer,失败并显示错误信息:/Users/emunsing/env/bin/python: No module named HTTPServer。 7. 为了再次确认,尝试重新安装:(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 使用Pip文档中描述的get-pip.py命令

这是我排除的原因: - 我没有使用sudo pip ... 这会导致其他问题的类似情况,并且从未在此Python/pip安装中这样做过。 - 我的虚拟环境未显示pip的本地安装,就像这些类似问题一样:Windows上的这一个Mac OS X上的这一个
最终,我发现消除~/.pydistutils.cfg文件可以解决问题,允许新的虚拟环境具有自己的本地pip。我的~/.pydistutils.cfg文件内容如下:
[global]
verbose=1

[install]
install-scripts=$HOME/bin

[easy_install]
install-scripts=$HOME/bin

只需将~/.pydistutils.cfg文件重命名即可解决问题:似乎尽管此文件由homebrew安装创建,但其中的某些设置可能与virtualenv不兼容。 尽管删除此文件对我的系统没有产生任何负面影响,但您可能需要在使用pip向全局环境安装软件包时使用--user标志(例如$ pip install --user HTTPServer)。 如果您想要调整文件以满足自己的需求,这里有更多.pydistutils.cfg的详细信息


这是绝对正确的。我删除了文件~/.pydistutils.cfg,所有问题都得到了解决。感谢您在一个答案中总结了很多信息。 - carlosdc
1
我找不到文件.pydistutils.cfg,使用locate .pydistutils.cfg但是没有找到它,同样的错误和调试显示相同的问题。还有其他解决方案吗?系统:Ubuntu - Vaulstein
1
@Vaulstein:这个问题和答案是针对Mac OS X的,可能是因为.pydistutils.cfg被homebrew(适用于Mac)编辑了。我无法在我可以访问的Ubuntu系统上复制这个问题,但如果你找到了解决方案,请一定发表评论,或者如果你没有找到解决方案,那么可能要发布一个针对Linux的问题,并链接到这里! - emunsing
@MrSingh,听起来你有一个不同的问题-为了诊断它,你需要提供关于尝试pip install包时发生的情况的细节。由于这个stackoverflow问题是关于“virtualenv不包括pip”的特定问题,如果你找不到解决方案,你可能想要创建一个新的问题,以便其他遇到相同问题的人也能得到帮助。 - emunsing
嗨@emunsing,我实际上是通过不断尝试才找到了解决方案。所以问题在于,如果我直接在我的主目录中创建虚拟环境文件夹'my-python-env',那么就没问题,否则,如果我先在主目录中创建一个文件夹(例如:'envs'),然后再在其中创建虚拟环境文件夹'my-python-env',pip就无法工作。无论如何,谢谢。 :) - Mr Singh
显示剩余3条评论

4
  1. virtualenv可执行文件在pip完成其工作后未放置在/usr/local/bin中,因此我需要手动进行ln -s操作(这可能表明在此步骤上安装存在问题)。

不要那样做。那只会隐藏错误而不解决问题。下面是一个简短的指南,用于调试这种问题:

  • 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的输出,以确保你拥有最新版本。


我已经仔细检查了你说的一切。所有的指向都首先指向 /usr/local/bin/…,以及版本为 13.1.2 的 virtualenvenv 没有显示任何与 PYTHON 相关的内容,尽管它看起来确实像是环境变量的问题。还有其他地方需要查找吗? - mikeonly
你之前删除了创建的符号链接吗?你可以重新安装 virtualenv 并添加从 pip 获取的输出,以及在创建新的虚拟环境时从 virtualenv 获取的输出。此外,你可以打印出激活 venv 的命令和激活 venv 后的 echo $PATH 命令。 - cel
只有在使用“--isolated”选项时,符号链接才能正确创建,它使得“pip”可以在“/usr/local/bin”中正确生成“virtualenv”。但是,在使用此“virtualenv”时仍无法在创建的“venv”中使用“pip”。以下是输出:http://pastebin.com/BbG8Ytap - mikeonly
我有一个类似的问题;virtualenv没有安装到/usr/local/bin,而是安装到/Users/username/bin(OS X El Capitan,python 2.7,pip 7.1.2)。env |grep PYTHON的输出为空...有什么想法吗; @cel? - emunsing
@emunsing,which -a pip 的输出是什么? - cel
@cel 我得到的输出是 /usr/local/bin/pip \n /Users/emunsing/bin/pip - emunsing

2

在运行虚拟环境时,我遇到了一个问题:"ImportError: No module named pip." 我的解决方法是降级virtualenv。我的版本是16.2.0。

请执行以下步骤:

  1. pip uninstall virtualenv
  2. pip install virtualenv==15.1.0

这样就可以解决该问题了。


0
尝试这个:sudo apt install pythonV.v-distutils。 在我的情况下,V.v == 3.8。 这对我有用。

0

我在Linux上遇到了同样的问题。似乎有多种原因导致这个问题,但对我来说,答案是删除~/.pip/

详情:出于某些原因,我在我的.pip/pip.conf中有以下内容:

$ cat ~/.pip/pip.conf 
[global]
use_https = True 
index = https://pypi.python.org/pypi
prefix = /home/sam/local/

该用户正在使用本地版本的Python和Pip,安装在~/local/目录下。由于某些原因,virtualenv安装时必须选择prefix = /home/sam/local/设置,因此pip也被安装在那里。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接