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

g_p*_*g_p 441 python pip

每当我尝试使用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'
Run Code Online (Sandbox Code Playgroud)


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())
Run Code Online (Sandbox Code Playgroud)

它之前工作正常,我不知道为什么它会抛出这个错误.我搜索了这个错误,但找不到任何解决方法.

如果您需要任何进一步的细节,请告诉我,我会更新我的问题.

Ant*_*ile 803

你必须无意中升级你的系统点(可能通过类似的东西sudo pip install pip --upgrade)

pip 10.x调整其内部所在的位置.pip3您看到的命令是由您的软件包维护者提供的命令(可能是debian基于此处?)而不是由pip管理的文件.

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

您可能希望升级系统点,而是使用virtualenv.

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

如果您想继续"不受支持的区域"(在系统软件包管理器之外升级系统软件包),您可能可以使用python3 -m pip ...而不是pip3.

  • 谢谢!这有帮助!使用`sudo python -m pip uninstall pip && sudo apt install python-pip --reinstall` for python2! (39认同)
  • `sudo apt install python3-pip --reinstall`没有解决问题,但我可以使用`python3 -m pip`安装包.谢谢你的帮助.我将其标记为已被接受. (25认同)
  • 同样的问题,`python3 -m pip`完成了工作. (12认同)
  • 我需要使用命令'python -m pip uninstall pip'作为'sudo pip uninstall pip'给原始问题一个类似的错误 (5认同)
  • @g_p更新了“修正”方向-只是在docker中验证了它们(我应该第一次这样做!) (2认同)

vij*_*hya 92

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

检查文件的位置:

$ which pip
Run Code Online (Sandbox Code Playgroud)

路径 - >/usr/bin/pip

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

输入: /usr/bin/pip

你可以看到:

from pip import main
if __name__ == '__main__':
     sys.exit(main())
Run Code Online (Sandbox Code Playgroud)

改成:

import sys
from pip import __main__
if __name__ == '__main__':
     sys.exit(__main__._main())
Run Code Online (Sandbox Code Playgroud)

然后按ctrl + o写入更改并退出

希望这会做!!

  • 工作就像一个魅力.谢谢vijay (4认同)
  • 确保你写的是 _main() 而不是 main() (4认同)
  • 进行这些更改并没有解决问题,但将其改回原始文本可以解决问题。¯\_(ツ)_/¯ (2认同)
  • 我试过了,但得到了`AttributeError: module 'pip.__main__' has no attribute 'main'` (2认同)
  • 在最新版本的“ pip3”中,“ main()”已移至“ pip._internal”。import语句应更改为`from pip._internal import main`。 (2认同)

Ale*_* C. 66

对于Ubuntu家族,Debian,Linux Mint用户

感谢Anthony 上面的解释,您可以保留原始系统点(在/ usr/bin /和dist-packages /中)并删除手动安装的点(在〜/ .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年以来默认打补丁的好选项.看看pip发行说明,新版本主要是关于特定于用例的错误修复和某些新功能,所以不是每个人都必须赶紧升级pip.无论如何,新的pip 10可以部署到Python virtualenvs.

但无论是什么点,你的操作系统都允许使用APT快速安装常见的Python模块(包括numpy),而不需要pip,例如:(
$ sudo apt install python3-numpy python3-scipy具有系统依赖性)
$ sudo apt install python3-pip(Debian-patched pip,略长但无关紧要)

快速语法提醒(请参阅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可能就是您所需要的.这些系统包也可以从虚拟环境访问,因为如果你的envs没有给定模块的副本,virtualenv将优雅地回退到导入时使用系统库.您自定义安装(带有pip --user)的每用户模块~/.local/lib也将覆盖它们.

请注意,由于这是一个系统范围的安装,因此您很少需要删除它们(需要注意操作系统依赖性).这对于具有许多系统依赖性的包(例如scipy或matplotlib)很方便,因为APT将跟踪并提供所有必需的系统库和C扩展,而使用pip则没有这样的保证.

事实上,对于系统范围的Python软件包(与每用户,家庭目录级别或更低级别相比),Ubuntu 期望使用APT软件包管理器(而不是sudo pip)来避免破坏操作系统:sudo pip3目标是/usr/lib/python3/dist-packagesAPT存储操作系统的同一目录 - 敏感模块.最近的Debian/Ubuntu版本在很大程度上依赖于Python 3,所以它预安装的模块由apt不管理的,不应该更改.

因此,如果您使用pip3 install命令,请确保它在隔离的虚拟开发环境中运行,例如使用virtualenv(sudo apt install python3-virtualenv),或使用Python3内置(-m venv),或者在每个用户级别(--userpip选项,默认情况下在Ubuntu中提供) pip自2016年起),但不是系统范围的(从不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任何非debian提供的pip 添加标志,除非你在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

  • @George这是因为现在在~~ ..local / lib / python3。?/ site-packages / pip中安装了更新的pip软件包,该软件包优先于相对Python导入中的系统apt(用户本地)网站优先于全局库)。并且由于较旧的包装器尝试对较新版本的pip软件包使用“从pip import main”而不是“ pip._internal”或其“ __main__”类,因此gist的pip命令失败,并显示“ ImportError:无法导入名称”主要”。因此,两个点可以共存(在磁盘上),但是原始系统的功能将被“破坏”。 (2认同)

Sak*_*ket 45

仅在一步中解决.

我也遇到过这个问题,但是这可以通过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.


Cir*_*四事件 29

python -m pip install而不是pip install

例:

python -m pip install --user somepackage
python3 -m pip install --user somepackage
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

它依赖于这个文件可以执行的事实import,但这是一种非常标准的接口类型,因此不像破解Debian脚本那样容易破解.

然后我建议将以下别名添加到您的.bashrc:

pip() ( python -m pip "$@" )
pip3() ( python3 -m pip "$@" )
Run Code Online (Sandbox Code Playgroud)

在从pip39.0.1 更新到18.0 之后,在Ubuntu 16.04中进行了测试.

  • 经过5个小时的搜索,这对我有用。如果您将地址寄给我,我可以为您送花。谢谢。 (2认同)

Cod*_*ker 17

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

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

Python2:

python -m pip uninstall pip && sudo apt install python-pip --reinstall
Run Code Online (Sandbox Code Playgroud)

Python3:

 python3 -m pip uninstall pip && sudo apt install python3-pip --reinstall
Run Code Online (Sandbox Code Playgroud)


Sr.*_*DRO 16

检查pip是否已缓存在另一个路径上,为此,调用$ which pip并检查路径是否与错误中提示的路径不同,如果是这样的话:

$ hash -r
Run Code Online (Sandbox Code Playgroud)

缓存清除后,pip将再次运行.参考:http://cheng.logdown.com/posts/2015/06/14/-usr-bin-pip-no-such-file-or-directory


Sco*_*ica 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
Run Code Online (Sandbox Code Playgroud)

这是唯一对我有用的东西,但它完美无缺!


jkj*_*g13 6

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

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


小智 5

我在使用新的 LXC(strech)的 Pixelbook 上也发生了同样的事情。这个解决方案与公认的解决方案非常相似,有一个细微的区别,它为我修复了 pip3。

sudo python3 -m pip install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

这影响了版本,现在它按预期工作。

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


Cla*_*ire 5

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