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

2024-04-16 20:20:05 发布

您现在位置:Python中文网/ 问答频道 /正文

每当我试图使用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())

我不知道为什么它会抛出这个错误。 我已经找遍了这个错误,但找不到任何东西来修复它。

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


Tags: installpipthenamefromimportbinmain
3条回答

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

pip 10.x调整其内部的位置。您看到的pip3命令是您的包维护人员提供的(可能是基于debian的?)并且不是由pip管理的文件。

你可以在pip's issue tracker上阅读更多关于这个的信息

您可能希望而不是升级系统pip,而是使用virtualenv。

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

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

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

由于Anthony的解释above,您可以保留原来的系统pip(in/usr/bin/和dist packages/)并删除手动安装的pip(in~/.local/)以解决冲突:

$ python3 -m pip uninstall pip

来自python3-pipDebian包的Ubuntu/Debian pip v8.1.1(16.04)显示了与最新pip v10.0.1相同的搜索结果,并且很好地安装了来自PyPI的最新模块。它有一个工作的pip命令(已经在$PATH中),加上自2016年以来默认修补的nice --user选项。从pip release notes来看,较新的版本主要是关于特定于用例的bug修复和某些新特性的,因此不是每个人都必须立即升级pip。无论如何,新的pip 10可以部署到Python virtualenvs。

但是,不管pip是什么,您的操作系统都允许使用APT快速安装公共Python模块(包括numpy),而不需要pip,例如:
$ sudo apt install python3-numpy python3-scipy(与系统相关)
$ sudo apt install python3-pip(Debian补丁pip,稍旧,但无所谓)

Quick apt syntax reminder (please see man apt for details):
$ sudo apt update (to resync Ubuntu package index files from up-to-date sources)
$ apt search <python-package-name> (full text-search on all available packages)
$ apt show <python-package-name> (displays the detailed package description)
$ sudo apt install <python-package-name>

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

注意,由于这是一个system-wide安装,您很少需要删除它们(需要注意操作系统依赖性)。这对于具有许多系统依赖项的包(例如使用scipy或matplotlib)很方便,因为APT将跟踪并提供所有必需的系统lib和C扩展,而使用pip则可以获得no such guarantees

事实上,对于系统范围内的Python包(与每个用户、home dir级别或更低级别相反),Ubuntu expects使用APT包管理器(而不是sudo pip)来避免破坏OS:sudo pip3目标与APT存储OS敏感模块的/usr/lib/python3/dist-packages目录完全相同。最近的Debian/Ubuntu版本在很大程度上依赖于Python 3,因此它的预装模块由apt管理,不应该更改。

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


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。

注意:除非您在virtualenv中,否则始终需要向任何非debian提供的pip添加--user标志!(它将python包部署到~/.local/,这是自2016年以来debian/ubuntu提供的python3 pip和pythonpip中的默认设置)。Ubuntu/Debian并不真正支持在virtualenv之外的系统范围内使用pip 10。永远不要sudo pip3

F型其他详细信息:
https://github.com/pypa/pip/issues/5221#issuecomment-382069604
https://github.com/pypa/pip/issues/5240#issuecomment-381673100

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

检查文件的位置:

$ which pip

path -> /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写入更改并退出

希望这样可以!!

相关问题 更多 >