virtualenv 不包括 pip
Posted
技术标签:
【中文标题】virtualenv 不包括 pip【英文标题】:virtualenv does not include pip 【发布时间】:2016-04-02 21:40:06 【问题描述】:我正在尝试在 Mac OS X El Capitan 上使用 virtualenv
创建一个虚拟环境。我已经安装了带有brew
的Python 2.7.11,默认情况下包括pip
、wheel
和setuptools
。
但是,当我尝试按照documentation 或任何其他资源中的说明安装virtualenv
时,我遇到了几个问题:
virtualenv
可执行文件在pip
完成工作后没有放在/usr/local/bin
中,所以我需要手动ln -s
它(它可能表明,这一步安装有问题)。
在我运行 virtualenv venv
之后,它会创建新环境,从 brew
-installation 捕获 Python 2.7.11,但是:bin
文件夹内没有 pip
。这意味着,如果我尝试which pip
,激活venv
,它将返回pip
— /usr/local/bin/pip
的全局位置,而不是/path/to/venv/bin/pip
。
因此,在venv
中安装包使用全局pip
并将它们安装到全局sites-packages
,而不是在venv
中,这与环境应该做的完全相反。
您能否建议可能出了什么问题以及如何解决?
编辑:要提到的是,我曾经在我的计算机上安装了其他版本的 Python,我最近删除了它,因为它被描述为 in this answer。可能是问题的原因,需要进行更彻底的清洁。
【问题讨论】:
你在安装virtualenv
时使用了sudo
吗?也许它以某种方式安装为用户私有包,这导致了麻烦。 (就像在安装过程中在PATH
等上没有放置二进制文件一样)
@millimoose 我在没有sudo
的情况下都试过了,结果是一样的。不太可能是权限问题,因为可以使用virtualenv.py
locally from source。使用 tarball 中的 virtualenv.py
也奇怪地无法发送 pip
。
【参考方案1】:
尝试删除或重命名主目录中的 .pydistutils.cfg 文件,例如通过重命名mv ~/.pydistutils.cfg ~/oldpydistutils.cfg
我在此处提供详细答案以帮助其他人,但原始功劳归this answer。如果您知道 .pydistutils.cfg 中具体是什么导致了问题,请告诉我!
我遇到了同样的问题:我的虚拟环境是在没有本地 pip 副本的情况下创建的,尽管它们有 python 的本地副本。这意味着在安装到全局包位置的虚拟环境中使用$ pip
,并且对环境的python 不可见。
我是如何在我的机器上诊断的:
-
我用
$ virtualenv env
创建了一个虚拟环境
使用$ source env/bin/activate
激活虚拟环境
检查 python 位置:运行 (env)$ which python
输出 /Users/<username>/env/bin/python
(如预期)
检查的 pip 位置:运行 (env)$ which pip
输出 /usr/local/bin/pip
(不是预期的)
要检查我们的包的去向,我们可以尝试在虚拟环境中安装一个包:
-
尝试安装包:
(env)$ pip install HTTPServer
成功
尝试运行包:(env)$ python -m HTTPServer
失败并出现错误/Users/emunsing/env/bin/python: No module named HTTPServer
要仔细检查,请尝试再次安装:(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 upgrade
和 brew 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。虽然删除此文件对我的系统没有任何不良影响,但在将带有 pip 的软件包安装到全局环境(例如 $ pip install --user HTTPServer
)时,您可能需要使用 --user
标志。如果您想根据自己的需要定制它,这里还有更多 details on .pydistutils.cfg。
【讨论】:
感谢您的详尽回答!我只是想说无法确认答案,因为我不再遇到上述问题。我有一台新电脑,谢天谢地,无法重现。但是,如果有人可以确认此解决方案有效,我将很乐意批准您的回答。 这完全正确。我删除了文件 ~/.pydistutils.cfg,我的所有问题都解决了。感谢您在一个答案中总结了大量信息。 我找不到文件.pydistutils.cfg
,使用locate .pydistutils.cfg
但找不到它,同样的错误和调试显示同样的问题。任何其他解决方案。系统:Ubuntu
@Vaulstein :这个问题和答案是 Mac OS X 特有的,可能是因为 .pydistutils.cfg 是由 homebrew 编辑的(对于 Mac)。我无法在我可以访问的 Ubuntu 系统上复制该问题,但如果您找到解决方案,请务必发表评论,或者如果您没有找到解决方案,则可能会发布 Linux 特定问题并链接到此!
@emunsing,我似乎遇到了同样的问题,即无法在 venv 中使用 pip 进行安装。但我没有得到你的第 4 步。当我做'which pip'时,它给了我环境的路径。此外,我的主目录中没有任何 .pydistutils.cfg 文件。是否有任何其他原因在我的机器上产生此问题?请帮忙。【参考方案2】:
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 的virtualenv
。 env
没有显示与 PYTHON
相关的任何内容,尽管它确实看起来像环境变量问题。还有什么地方可以看的?
您是否删除了之前创建的符号链接?您能否重新安装virtualenv
并添加从pip
获得的输出,以及在创建新venv 时从virtualenv
获得的输出。也可以在激活venv后打印用于激活venv
和echo $PATH
的命令。
符号链接只有在我使用--isolated
选项时才能正确创建,它使pip
在/usr/local/bin
中正确生成virtualenv
。使用这个virtualenv
仍然不会在创建的venv
中给出pip
。这是输出:pastebin.com/BbG8Ytap
我也有类似的问题; virtualenv 没有安装到 /usr/local/bin 而是安装到 /Users/username/bin (OS X El Capitan,python 2.7,pip 7.1.2)。 env |grep PYTHON
的输出是空的……任何想法; @cel?
@emunsing,which -a pip
的输出是什么?【参考方案3】:
我在运行 virtualenv 时遇到问题:“ImportError:没有名为 pip 的模块。” 我的解决方案是降级 virtualenv。我有 16.2.0。 pip 卸载 virtualenv pip install virtualenv==15.1.0
【讨论】:
以上是关于virtualenv 不包括 pip的主要内容,如果未能解决你的问题,请参考以下文章
为什么我不能“停用”pyenv / virtualenv?如何“修复”安装