升级pip后错误:无法导入名称'main'

每当我试图使用pip安装任何包时,我都会得到这个导入错误:

guru@guru-notebook:~$ pip3 install numpy
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'

< br >

guru@guru-notebook:~$ cat `which pip3`
#!/usr/bin/python3
# GENERATED BY DEBIAN


import sys


# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import main
if __name__ == '__main__':
sys.exit(main())

它之前工作得很好,我不确定为什么会抛出这个错误。 我已经搜索了这个错误,但找不到任何东西来修复它

如果你需要进一步的细节,请让我知道,我会更新我的问题。

425090 次浏览

你一定是无意中升级了你的系统pip(可能是通过sudo pip install pip --upgrade之类的东西)

皮普10。X调整它内部的位置。你看到的pip3命令是由你的包维护者提供的(想必debian基于这里?),而不是由pip管理的文件。

你可以在皮普的问题追踪器上阅读更多

你可能会想升级你的系统pip,而不是使用virtualenv。

要恢复pip3二进制文件,你需要sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

如果你想继续在“不受支持的领域”(在系统包管理器之外升级系统包),你可能会使用python3 -m pip ...而不是pip3

检查pip是否缓存在另一个路径上,为此,调用$哪个PIP并检查该路径与错误中提示的路径不同,如果是这种情况,则运行:

$ hash -r

当缓存被清空时,pip将重新工作。 参考:http://cheng.logdown.com/posts/2015/06/14/-usr-bin-pip-no-such-file-or-directory < / p >

我使用sudo apt remove python3-pip,然后pip工作。

 ~ sudo pip install pip --upgrade
[sudo] password for sen:
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'
➜  ~ sudo apt remove python3-pip
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
libexpat1-dev libpython3-dev libpython3.5-dev python-pip-whl python3-dev python3-wheel
python3.5-dev
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
python3-pip
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 569 kB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 215769 files and directories currently installed.)
Removing python3-pip (8.1.1-2ubuntu0.4) ...
Processing triggers for man-db (2.7.5-1) ...
➜  ~ pip


Usage:
pip <command> [options]

适用于Ubuntu系列、Debian、Linux Mint用户

感谢Anthony的解释以上,你可以保留你原来的系统pip(在/usr/bin/和dist-packages/中),并删除手动安装的pip(在~/.local/中)来解决冲突:

$ python3 -m pip uninstall pip

Ubuntu/Debian pip v8.1.1 (16.04) from python3-pip Debian包(见__abc1)显示与最新的pip v10.0.1相同的搜索结果,并从PyPI安装最新的模块。它有一个工作的pip命令(已经在$PATH中),加上自2016年默认修补的漂亮的--user选项。看看PIP发行说明,更新的版本主要是关于特定用例的错误修复和某些新功能,所以每个人都必须赶紧升级。无论如何,新的pip 10可以部署到Python virtualenvs中。

但是不管有没有pip,你的操作系统都允许使用APT快速安装常用的Python模块(包括numpy),而不需要pip,例如 $ sudo apt install python3-numpy python3-scipy(带系统依赖项)
$ sudo apt install python3-pip (debian补丁的pip,稍微老一点,但没关系)

快速apt语法提醒(详细信息请参见man apt):
$ sudo apt update(从最新源重新同步Ubuntu包索引文件)
. $ sudo apt update(从最新源重新同步Ubuntu包索引文件) $ apt search <python-package-name>(所有可用包的完整文本搜索)
. $ apt search <python-package-name>(所有可用包的完整文本搜索) $ apt show <python-package-name>(显示详细的包描述)
$ sudo apt install <python-package-name> < / p >

python-为前缀的包名适用于Python 2;和前缀为python3-的是Python 3(例如python3-pandas)。有数千个,它们在Debian和Ubuntu中进行集成测试。除非您寻求在每个用户级别(pip install --user选项)或在virtualenv/venv中安装,否则apt可能是您所需要的。这些系统包也可以从虚拟环境中访问,因为如果你的环境没有提供模块的副本,virtualenv将优雅地在导入时使用系统库。 你在~/.local/lib中自定义安装的每个用户模块(使用pip --user)也会覆盖它们

注意,由于这是一个整个系统的安装,你很少需要删除它们(需要注意OS依赖关系)。这对于有很多系统依赖的包(比如scipy或matplotlib)来说很方便,因为APT会跟踪并提供所有必需的系统库和C扩展,而pip则有没有这样的保证

事实上,对于系统级Python包(相对于每个用户、主目录级别或更低级别),Ubuntu 预计使用APT包管理器(而不是sudo pip)来避免破坏操作系统:sudo pip3针对的是相同的/usr/lib/python3/dist-packages目录,APT存储对操作系统敏感的模块。最近的Debian/Ubuntu版本严重依赖于Python 3,所以它的预安装模块由apt管理,不应该被改变。

因此,如果你使用pip3 install命令,请确保它运行在一个隔离的虚拟开发环境中,例如使用virtualenv (sudo apt install python3-virtualenv),或内置Python3 (-m venv),或在每个用户级别(--user pip选项,自2016年以来Ubuntu提供的pip默认),但在系统范围内(绝不是sudo pip3!),因为pip 影响与APT包管理器的操作一起,当系统使用的python模块意外更改时,可能会影响Ubuntu OS 组件。好运!


以上都是“理想的”解决方案(Debian/Ubuntu方式)。

如果你仍然想独占使用新的pip3 v10,有3个快速解决方案:

  • 只需打开一个新的bash会话(一个新的终端选项卡,或者键入bash)——pip3 v10就可用了(参见pip3 -V)。Debian的pip3 v8仍在安装,但已损坏;或
  • 使用$ hash -d pip3 && pip3 -V命令刷新$PATH中的pip3路径名。Debian的pip3 v8仍在安装,但已损坏;或
  • 使用$ sudo apt remove python3-pip && hash -d pip3命令完全卸载debian的pip3 v8,以支持新的pip3 v10。

你总是需要在任何非debian提供的pip中添加--user标志,除非你在virtualenv中!(它将python包部署到~/.local/,自2016年起debian/ubuntu提供的python3-pip和python-pip中的默认值)。Ubuntu/Debian并不真正支持在virtualenv之外的系统范围内使用pip 10。从不sudo pip3 !

进一步详细信息:
.

https://github.com/pypa/pip/issues/5221#issuecomment-382069604
https://github.com/pypa/pip/issues/5240#issuecomment-381673100 < / p >

我在Ubuntu 16.04系统上遇到了同样的问题。我设法用以下命令重新安装pip来修复它:

curl https://bootstrap.pypa.io/get-pip.py | sudo python3

我在Pixelbook上使用新的LXC(拉伸)时也遇到了同样的情况。这个解决方案与公认的解决方案非常相似,只有一个细微的区别,这为我固定了pip3。

sudo python3 -m pip install --upgrade pip

这使版本发生了变化,现在它按预期工作。

我在这里找到的……Python.org 确保pip是最新的

使用python3 -m pip install --user pip==9.0.1(或有效的版本)恢复

我使用pip3修复错误的方法是:

sudo cp -v /usr/local/bin/pip3 /usr/bin/pip3

所有的工作原理:

 demon@UbuntuHP:~$ pip -V
pip 10.0.1 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)


demon@UbuntuHP:~$ pip2 -V
pip 10.0.1 from /home/demon/.local/lib/python2.7/site-packages/pip (python 2.7)


demon@UbuntuHP:~$ pip3 -V
pip 10.0.1 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)

也许新的10.0.1版本的pip没有更新/usr/bin中的二进制文件?(但事实似乎并非如此)

编辑:同样的问题出现在Ubuntu 18.04中。我发现的最佳解决方案是将pip二进制文件从/home/<user/.local/bin符号链接到/usr/local/bin/usr/bin(取决于你的偏好),如下所示:

ln -sv /home/<user>/.local/bin/pip /usr/local/bin/pip
ln -sv /home/<user>/.local/bin/pip2 /usr/local/bin/pip2
ln -sv /home/<user>/.local/bin/pip2.7 /usr/local/bin/pip2.7
ln -sv /home/<user>/.local/bin/pip3 /usr/local/bin/pip3
ln -sv /home/<user>/.local/bin/pip3.6 /usr/local/bin/pip3.6


注意:<user>替换为当前运行用户

相关版本(最新)如下:

3.6版本:

/home/demon/.local/lib/python3.6/site-packages/pip (python 3.6)

2.7版本:

/home/demon/.local/lib/python2.7/site-packages/pip (python 2.7)

上面的命令对我没用,但它们非常有用:

sudo apt purge python3-pip
sudo rm -rf '/usr/lib/python3/dist-packages/pip'
sudo apt install python3-pip
cd
cd .local/lib/python3/site-packages
sudo rm -rf pip*
cd
cd .local/lib/python3.5/site-packages
sudo rm -rf pip*
sudo pip3 install jupyter

从pip._internal导入main

from pip._internal import main

编辑pip代码

sudo nano /usr/bin/pip3

我们可以通过修改pip文件来清除错误。

检查文件的位置:

$ which pip

路径-> /usr/bin/pip

转到该位置(/usr/bin/pip)并打开终端

输入:$ sudo nano pip

你可以看到:

import sys
from pip import main
if __name__ == '__main__':
sys.exit(main())

改变:

import sys
from pip import __main__
if __name__ == '__main__':
sys.exit(__main__._main())

然后CTRL + o写入更改并退出

希望这能奏效!!

只需一步即可解决。

我也遇到过这个问题,但这可以简单地通过1个命令来解决,而不用打扰和浪费时间,我已经在多个系统上尝试过了,这是这个问题最干净的解决方案。这就是:

对于python3:- sudo python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

这样,你就可以简单地使用pip3安装包。检查使用pip3 --version

对于旧版本,使用:sudo python -m pip uninstall pip && sudo apt install python-pip --reinstall

这样,现在你就可以简单地使用pip安装包了。检查使用pip --version

我也有同样的问题,但我已经解决了。这是我的解决方案。 首先,当我运行pip install something时,错误出现如下:

Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'

因此,我cd到文件/usr/bin/和cat pip3中查看其中的代码。我看到了这一点:

#!/usr/bin/python3
# GENERATED BY DEBIAN
import sys
# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import main
if __name__ == '__main__':
sys.exit(main())

然后我认为它不在安装路径中。所以我cd到python3-pip,像这样:

cd /.local/lib/python3.5/site-packages/pip
< p >注:你必须在你的电脑里把cd导入正确的方向 然后我cat文件查看差异(你可以使用其他操作查看代码):

cat __main__.py

我看到了这个:

from __future__ import absolute_import
import os
import sys
# If we are running from a wheel, add the wheel to sys.path
# This allows the usage python pip-*.whl/pip install pip-*.whl
if __package__ == '':
# __file__ is pip-*.whl/pip/__main__.py
# first dirname call strips of '/__main__.py', second strips off '/pip'
# Resulting path is the name of the wheel itself
# Add that to sys.path so we can import pip
path = os.path.dirname(os.path.dirname(__file__))
sys.path.insert(0, path)


from pip._internal import main as _main  # isort:skip # noqa


if __name__ == '__main__':
sys.exit(_main())

所以,你能看出区别吗?我可以弄清楚,我必须使该文件与/usr/bin/pip3中的文件相同

所以,我复制了/.local/lib/python3.5/site-packages/pip中的代码来替换/usr/bin/pip3中的代码 问题就消失了!< / p > < p >注:: pip3和PIP在这个问题上没有区别。 如果我的解决方案解决了你的问题,我会很高兴!< / p >

正如@cryptoboy所说-检查你安装的pip/python版本

 demon@UbuntuHP:~$ pip -V
demon@UbuntuHP:~$ pip2 -V
demon@UbuntuHP:~$ pip3 -V

然后在.local/lib/文件夹中检查不需要的库。

当我迁移到更新的Kubuntu时,我备份了设置,在我的主目录中有.local/lib/python2.7/文件夹。安装python 3.6。我刚刚删除了旧文件夹,现在一切都很好!

使用python -m pip install代替pip install

例子:

python -m pip install --user somepackage
python3 -m pip install --user somepackage

pip (resp。pip3)可执行文件由你的发行版(Ubuntu 16.04上的python-pip包)提供,位于/usr/bin/pip

因此,当你升级pip时,它不会与pip包本身保持最新,并且可能会损坏。

如果你直接使用python -m pip,例如:

python -m pip install --user somepackage
python3 -m pip install --user somepackage

它会遍历你的Python路径,找到pip的最新版本并执行该文件。

它依赖于这样一个事实,即文件可以通过import执行,但这是一种非常标准的接口类型,因此不太可能比更黑客的Debian脚本崩溃。

然后我建议在你的.bashrc中添加以下别名:

pip() ( python -m pip "$@" )
pip3() ( python3 -m pip "$@" )

Ubuntu 18.04 /usr/bin/pip3文件:

from pip import main

大概是main在某个时候从pip中删除了,这就是破坏的原因。

中断的pip提交似乎是:95bcf8c5f6394298035a7332c441868f3b0169f4 "移动所有内部api到pip._internal",它进入了pip 18.0。

在Ubuntu 16.04中测试,从pip3 9.0.1更新到18.0。

pyenv

然而,最终,对于严肃的Python开发,我只建议你用pyenv + virtualenv安装你自己的本地Python,这也可以解决Ubuntu的这个bug: https://askubuntu.com/questions/682869/how-do-i-install-a-different-python-version-using-apt-get/1195153#1195153

我在一个系统上运行,我有sudoapt但没有sudopip。(并且没有su访问权限。)我听从了皮普的建议,陷入了同样的境地:

您使用的是pip 8.1.1版本,但是有18.0可用。您应该考虑通过'pip install——upgrade pip'命令进行升级。

其他修复对我都不起作用,因为我没有足够的管理权限。然而,在阅读这篇文章后,有几件事让我印象深刻:

  • 我不应该这么做的。当然,皮普让我这么做的。它撒了谎。
  • 使用——user通过关注仅用户目录解决了许多问题。

因此,我发现这个命令行可以将我恢复到原来的位置。如果您使用的是与8.1.1不同的版本,那么您显然希望更改该行的这一部分。

python -m pip install --force-reinstall pip==8.1.1 --user

这是唯一对我有效的方法,但它非常有效!

对于Python 2.7版本,@Anthony解决方案完美工作,通过将python3更改为python,如下所示:

sudo python -m pip uninstall pip && sudo apt install python-pip --reinstall

您可以通过重新安装pip来解决此问题。

使用以下命令行命令之一重新安装pip:

Python2:

python -m pip uninstall pip && sudo apt install python-pip --reinstall

Python3:

 python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall

把戏也有用

sudo -H pip install lxml

我有同样的错误,但python -m pip仍在工作,所以我用核选项sudo python -m pip install --upgrade pip修复了它。它为我做到了。

在ubuntu 18.04.1 Bionic Beaver中,您需要登出并重新登录(不需要重新启动)以获得适当的环境。

$ sudo apt install python-pip


$ pip --version
pip 9.0.1 from /usr/lib/python2.7/dist-packages (python 2.7)


$ pip install --upgrade pip


$ pip --version
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
from pip import main
ImportError: cannot import name main


$ exit
<login>


$ pip --version
pip 18.1 from /home/test/.local/lib/python2.7/site-packages/pip (python 2.7)

在Debian上,你需要先更新apt ....

sudo apt-get update -qq
sudo apt-get install python-pip -qq
sudo pip install pip --upgrade --quiet
sudo pip2 install virtualenv --quiet

如果你跳过'sudo apt-get update -qq',你的pip将变得腐败,并显示'无法找到主'错误。

这个错误可能是权限错误。因此,测试执行带有- h标志的命令:

sudo -H pip3 install numpy

为了它的价值,我有pip(不是pip2pip3)的问题:

$ pip -V
Traceback (most recent call last):
File "/usr/bin/pip", line 9, in <module>
from pip import main
ImportError: cannot import name main


$ pip2 -V
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)


$ pip3 -V
pip 8.1.1 from /usr/lib/python3/dist-packages (python 3.5)

不知怎的(我不记得是怎么),我在~/.local目录中安装了python的东西。在我从那里删除pip目录后,pip又开始工作了。

$ rm -rf /home/precor/.local/lib/python2.7/site-packages/pip
$ pip -V
pip 8.1.1 from /usr/lib/python2.7/dist-packages (python 2.7)

在执行任何pip命令之前,请使用以下命令

hash -d pip

会有用的

当它生成de文件/usr/bin/pip时,是包有问题吗? 你必须改变导入:

from pip import main

from pip._internal import main

这解决了问题,我不确定为什么它产生,但它在以下问题中说了一些事情:

pyenv上pip 10升级后"ImportError: cannot import name 'main'" .

你可以试试这个:

sudo ln -sf $( type -P pip ) /usr/bin/pip

当我想将系统pip pip3从9.0.1升级到19.2.3时,我也遇到了这个问题。

运行pip3 install --upgrade pip后,pip版本变为19.2.3。但是在最新版本中,main()已经被移到了pip._internal中,这使得pip3被破坏了。

所以在文件/usr/bin/pip3中,将line 9: from pip import main替换为from pip._internal import main。该问题将被修复,适用于python2-pip。(在Ubuntu 18.04发行版上测试)

根据@Vincent H。的回答

请运行以下命令进行修复。运行python3 -m pip install --upgrade pip后,请执行以下命令。

hash -r pip

来源:https://github.com/pypa/pip/issues/5221

你可以使用update-alternatives简单地修复pip和pip3路径

你应该检查的第一件事是你当前的$PATH 运行echo $PATH,看看是否可以找到/usr/local/bin,即pip3和pip通常在

的位置

有一个变化,您的系统正在这里查找/bin/pip/bin/pip3 因此,我将通过添加到你的~/.bash_profile文件来修复PATH,使其持续

< p > export PATH=$PATH:/usr/local/bin 然后检查它是否被which pipwhich pip3

修复

如果不是,最后使用update-alternatives来修复它

update-alternatives --install /bin/pip3 pip3 /usr/local/bin/pip3 30

如果你想把PIP指向pip3,那么

update-alternatives --install /bin/pip pip /usr/local/bin/pip3 30

这对我很管用!

hash -r pip # or hash -d pip

现在,卸载pip安装的版本,并使用以下命令重新安装它。

python -m pip uninstall pip  # sudo
sudo apt install --reinstall python-pip

如果pip坏了,使用:

python -m pip install --force-reinstall pip

希望能有所帮助!

我使用下面的代码来加载一个可能需要安装的模块,从而避免了这个错误(我也得到了这个错误)-使用最新的Python和最新的pip没有问题

try
from colorama import Fore, Back, Style
except:
!pip install colorama
from colorama import Fore, Back, Style