升级pip后出错:无法导入名称“ main”


467

每当我尝试使用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'


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())

之前它运行良好,我不确定为什么会引发此错误。我已经搜索了此错误,但找不到任何可解决的错误。

如果您需要更多详细信息,请告诉我,我将更新我的问题。


1
此链接上进行附加讨论。
对角线

7
我遇到了同样的问题,因为我曾经pip install --upgrade pip在没有管理员权限的服务器上升级了pip。卸载pip python -m pip uninstall pip解决了我的问题。
Foad

答案对我没有帮助。这是我的问题:github.com/pypa/pipenv/issues/2095
艾蒂安

Answers:


846

您必须不经意间升级了系统pip(可能通过sudo pip install pip --upgrade

pip 10.x调整其内部位置。pip3您看到的命令是您的软件包维护者提供的(这里大概是基于debian的?),而不是pip管理的文件。

您可以在pip的问题跟踪器上了解有关此内容的更多信息

你可能会想升级系统PIP和改为使用的virtualenv。

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

如果您想继续在“不受支持的地区”(在系统软件包管理器之外升级系统软件包),则可以选择使用python3 -m pip ...代替pip3


28
sudo apt install python3-pip --reinstall不能解决问题,但是我可以使用安装软件包python3 -m pip。谢谢你的帮助。我将其标记为已接受。
g_p

2
@g_p更新了“修正”方向-刚刚在docker中验证了它们(我应该第一次这样做了!)
Anthony Sottile

5
我需要使用命令“ python -m pipuninstall pip”作为“ sudo pipuninstall pip”给出了与原始问题类似的错误
Mz A

41
谢谢!有帮助!使用sudo python -m pip uninstall pip && sudo apt install python-pip --reinstall的python2!
Barmaley

1
适用于Windows上的Ubuntu。该解决方案就是@Barmaley对python2(默认的python解释器)的建议。
jdhao

110

我们可以通过修改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
进行这些更改不能解决问题,但是将其更改回原始文本即可。¯_(ツ)_ /¯–
David

2
我试过了,但得到了AttributeError: module 'pip.__main__' has no attribute 'main'
–dnnagy

3
确保您写的是_main()而不是main()
vijay athithya

2
在最新版本中pip3main()移至pip._internal。进口声明应更改为from pip._internal import main
Yossarian42

2
像魅力一样工作!谢谢
mahesh nanayakkara

68

对于Ubuntu系列,Debian和Linux Mint用户

多亏了Anthony的上述说明,您可以保留原始系统pip(位于/ usr / bin /和dist-packages /中)并删除手动安装的pip(位于〜/ .local /中)以解决冲突:

$ python3 -m pip uninstall pip

来自python3-pipdebian软件包的Ubuntu / Debian pip v8.1.1(16.04)(请参阅参考资料$ pip3 -V)显示的搜索结果与最新的pip v10.0.1相同,并且可以从PyPI安装最新的模块。它具有有效的pip命令(已在$ PATH中),以及--user自2016年以来默认修补的nice 选项。查看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软件包索引文件)
$ apt search <python-package-name> (对所有可用软件包进行全文搜索)
$ apt show <python-package-name>(显示详细的软件包说明)
$ sudo apt install <python-package-name>

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

请注意,由于这是系统范围的安装,因此您几乎不需要删除它们(需要注意OS依赖性)。这对于具有许多系统依赖性的软件包(例如,使用scipy或matplotlib)很方便,因为APT会跟踪并提供所有必需的系统库和C扩展名,而使用pip则无法保证

实际上,对于系统范围的Python软件包(与按用户,主目录级别或更低级别的软件包相反),Ubuntu 希望使用APT软件包管理器(而不是sudo pip)来避免破坏OS:sudo pip3/usr/lib/python3/dist-packagesAPT存储OS的同一目录为目标敏感模块。Debian / Ubuntu的最新发行版在很大程度上依赖于Python 3,因此其预装模块由apt且不应该更改。

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


P. S. 以上都是针对“理想”解决方案的(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。

注意:--user除非您处于virtualenv中,否则您将始终需要将标记添加到任何非debian提供的pip中!(~/.local/自2016年起,它将python软件包部署到,默认为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


你能帮助我了解为什么安装升级版的pip 本地--user,即没有sudo,影响了我的运行容易安装的能力pip?我以为两者会共存。但是正如这个要点所示,我安装之后容易中断python3 -m pip install --user --upgrade pip。我不是在寻找解决方案-我只是真的很想了解这里发生的事情。
乔治·霍金斯

1
@George这是由于pip库与其导入它们的包装器之间不匹配而发生的。尝试立即运行system pip命令(不应用任何解决方案)仍会调用apt安装的系统版本的pip wrapper脚本,/usr/bin/pip3而不是根据OS系统$ PATH仍设置为运行该命令的操作系统--user~/.local/bin/pip*)安装。系统版本的包装,但不是它的图书馆..
亚历C.

2
@George这是因为现在安装了一个更新的pip软件包~/.local/lib/python3.?/site-packages/pip,相对于相对于Python导入的系统,pip软件包具有优先于系统的优先级(用户本地站点优先于全局库)。并且,由于较旧的包装器尝试对新版本的pip包进行尝试,from pip import main而不是尝试使用from pip._internal__main__类,所以gist的pip命令失败了ImportError: cannot import name 'main'。所以,这两个点子可以共存(在磁盘上),但功能原系统中的一个将被“打破”的..
亚历C.

为+1 --userpip install --user对我来说是什么 (我有python 2.7,python 3.6和python 3.7,都安装在Ubuntu 18.04 LTS上。)
Stephen G Tuggy

46

仅一步解决。

我也曾经遇到过这个问题,但是可以简单地通过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


31

使用python -m pip install代替pip install

例:

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

pip(相应地pip3)执行是由你的发行版提供的(python-pip在Ubuntu 16.04封装)和位于/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

大概mainpip在某个时候被破坏了。

中断的pip提交似乎是:95bcf8c5f6394298035a7332c441868f3b0169f4“将所有内部API移至pip._internal”已进入pip 18.0。

pip39.0.1升级到18.0 后,在Ubuntu 16.04中进行了测试。

pyenv

但是,最终,对于认真的Python开发,我只建议您使用pyenv + virtualenv安装自己的本地Python,这也可以解决以下Ubuntu错误:https ://askubuntu.com/questions/682869/how-do-i- 安装一个不同的python-version-using-apt-get / 1195153#1195153


3
经过5个小时的搜索,这对我有用。如果您将地址寄给我,我可以为您送花。谢谢。
cagri 18-10-10

18

您可以通过重新安装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


8

我在有sudo apt但没有sudo pip的系统上运行。(并且没有su访问权限。)我按照pip的建议进入了同样的情况:

您正在使用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

那是唯一对我有用的东西,但是效果很好!


7

使用python3 -m pip install --user pip==9.0.1(或可用的版本)进行恢复


5

使用新的LXC(strech)在Pixelbook上发生了同样的事情。此解决方案与公认的解决方案非常相似,只是有一个细微的区别,即我固定了pip3。

sudo python3 -m pip install --upgrade pip

颠覆了版本,现在可以正常工作了。

我在这里找到了它。Python.org:确保pip是最新的


4

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

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


它的好处是您可以从源代码安装它,而以上都不是在干净的空Debian 9(来自我的专用服务器提供商)上工作的
Peter Rosemann,

卷曲互联网给超级用户,可能出什么问题了!
Sum1sAdmin

3

上面的命令对我不起作用,但这些命令非常有用:

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

2

在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)

1

我用 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]

1
这是因为pip是针对Python 2的。OP使用pip3pip您刚刚删除的Python 3版本。这两个是截然不同且不可互换的。
Neinstein '18

1

对于Python 2.7版,@ Anthony解决方案可以完美实现,方法是将python3更改为python,如下所示:

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

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)


这个解决了我的问题。其他答案没有。
阿敏·胡斯尼

1
您确实不应该直接将文件弄乱/usr/bin。而且,PATH如果/usr/local/bin不是以前,您是错误的/usr/bin
Tripleee

pip二进制文件在中不存在/usr/local/bin。它仅在/home/<user>/.local/bin和/或/home/<user>/.local/lib/python<version>/site-packages/pip新版本中存在(v10.0 +不会更新中的二进制文件/usr/bin)。因此,需要在/usr/bin或中/usr/local/bin(取决于用户首选项)创建二进制文件的副本或符号链接的原因,以便可以从命令行全局运行pip。
cryptoboy

目录pip二进制文件存在,应从以下地址链接/复制:demon @ Bionic18:〜/ .local / bin $ ls pip pip2 pip2.7 pip3 pip3.6该 pip二进制文件默认为系统上安装的最新版本
cryptoboy


0

我也遇到了同样的错误,但python -m pip仍在工作,因此我使用了核选项解决了该问题sudo python -m pip install --upgrade pip。它为我做到了。


0

对于它的价值,我遇到了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)



0

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

运行后pip3 install --upgrade pippip版本变为19.2.3。但main()已移至pip._internal最新版本,但已pip3损坏。

因此,在文件中/usr/bin/pip3,替换line 9from pip import mainfrom pip._internal import main。该问题将得到解决,适用于python2-pip。(在Ubuntu 18.04发行版上测试)

根据@Vincent H.的回答



0

您可以简单地使用以下方法修复pip和pip3路径 update-alternatives

您应该检查的第一件事是当前$PATH 运行情况,echo $PATH然后您可以找到/usr/local/binpip3和pip通常在哪里

有一个变化,您的系统正在这里寻找/bin/pip/bin/pip3 所以我会说通过添加到您的~/.bash_profile文件中使其持久存在

export PATH=$PATH:/usr/local/bin 然后用which pip和检查它是否固定which 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

0

这对我有用!

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

希望能帮助到你!


-1

从pip._internal导入main

from pip._internal import main

编辑来自的点子代码

sudo nano /usr/bin/pip3

您可以编辑答案并更好地指定答案吗?尚不清楚如何编辑文件/usr/bin/pip3……
M. Volf,

-1

正如@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。我刚刚删除了旧文件夹,现在一切正常!


-1

在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”,则您的点会损坏并显示“找不到主要”错误。



-1

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

hash -d pip

会工作的


1
您能否澄清一下将如何​​帮助/ +删除任何居高临下的评论?
精灵”
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.