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

2025-01-16 08:38:00
admin
原创
123
摘要:问题描述:每当我尝试使用 pip 安装任何包时,都会出现此导入错误:guru@guru-notebook:~$ pip3 install numpy Traceback (most recent call last): File "/usr/bin/pip3", line 9, in ...

问题描述:

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

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

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

您可以在pip 的问题跟踪器上阅读更多相关信息

您可能不想升级系统 pip,而是使用虚拟环境。

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

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

解决方案 2:

我们可以通过修改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写入更改并退出

希望这样就可以了!!

解决方案 3:

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

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

$ python3 -m pip uninstall pip

python3-pip来自debian 软件包(参见)的 Ubuntu/Debian pip v8.1.1 (16.04)$ pip3 -V显示的结果与最新的 pip v10.0.1 相同,并且可以很好地安装来自 PyPI 的最新模块。它有一个有效的pip命令(已经在 $PATH 中),以及--user自 2016 年以来默认修补的漂亮选项。查看pip 发行说明,较新的版本主要是针对用例的特定错误修复和某些新功能,因此并不是每个人都必须急于升级 pip。而且无论如何,新的 pip 10 可以部署到 Python 虚拟环境中。

但无论使用 pips 还是其他方式,你的操作系统都允许使用 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也会覆盖它们。

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

事实上,对于系统范围的 Python 包(与每个用户、主目录级别或更低级别不同),Ubuntu希望使用 APT 包管理器(而不是sudo pip)来避免破坏 OS:sudo pip3目标是 APT 存储 OS 敏感模块的同一/usr/lib/python3/dist-packages目录。最近的 Debian/Ubuntu 版本严重依赖 Python 3,因此其预安装的模块由 Python 3 管理apt,不应更改。

因此,如果您使用pip3 install命令,请确保它在隔离的虚拟开发环境中运行,例如使用virtualenv ( sudo apt install python3-virtualenv) 或使用内置的 Python3 ( -m venv),或在每个用户级别(--userpip 选项,自 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。

注意:除非您处于虚拟环境中,否则您将始终需要--user向任何非 Debian 提供的 pip 添加标志!(它将 Python 包部署到~/.local/,自 2016 年以来,Debian/ubuntu 提供的 python3-pip 和 python-pip 中默认如此)。在虚拟环境之外,Ubuntu/Debian 并不真正支持您在系统范围内使用 pip 10。绝不sudo pip3

更多详细信息:

https ://github.com/pypa/pip/issues/5221#issuecomment-382069604

https://github.com/pypa/pip/issues/5240#issuecomment-381673100

解决方案 4:

仅需一步即可解决。

我也遇到过这个问题,但只需 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

解决方案 5:

使用python -m pip install而不是pip install

例子:

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

pip(相应的)可执行文件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。

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

pyenv

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

解决方案 6:

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

解决方案 7:

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

$ hash -r

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

解决方案 8:

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

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

其他修复方法都对我不起作用,因为我没有足够的管理员权限。不过,在阅读本文后,我发现了以下几点:

  • 我不应该这么做。当然,pip 让我这么做。它撒了谎。

  • 使用 --user 通过关注仅限用户的目录解决了很多问题。

因此,我发现此命令行可以让我恢复到原来的状态。如果您使用的不是 8.1.1 版本,您显然需要更改该行的这一部分。

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

这是唯一对我有用的东西,但效果非常好!

解决方案 9:

我在 Ubuntu 16.04 系统上遇到了同样的问题。我通过使用以下命令重新安装 pip 成功解决了该问题:

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

解决方案 10:

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

解决方案 11:

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

sudo python3 -m pip install --upgrade pip

这提高了版本,现在它可以按预期运行。

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

解决方案 12:

上面的命令对我来说不起作用,但是它们非常有用:

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

解决方案 13:

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

解决方案 14:

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

解决方案 15:

对于 Python 版本 2.7,@Anthony 解决方案非常有效,通过将python3更改为python如下:

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

解决方案 16:

我使用以下方法修复了错误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)

解决方案 17:

技巧和作品

sudo -H pip 安装 lxml

解决方案 18:

我也遇到了同样的错误,但python -m pip仍然可以工作,所以我用核选项修复了它sudo python -m pip install --upgrade pip。它帮我解决了这个问题。

解决方案 19:

不管怎样,我遇到了pip(not pip2or pip3) 的问题:

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

解决方案 20:

软件包有问题,当它生成文件 /usr/bin/pip 时,您必须更改导入:

from pip import main

from pip._internal import main

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

在 pyenv 上升级 pip 10 后出现“ImportError: 无法导入名称‘main’”

解决方案 21:

您可以尝试以下操作:

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

解决方案 22:

当我想将系统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 mainfrom pip._internal import main。此问题将得到修复,其工作原理相同python2-pip。(在 Ubuntu 18.04 发行版上测试)

根据@Vincent H.的回答

解决方案 23:

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

hash -r pip

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

解决方案 24:

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

你应该检查的第一件事是你当前的$PATH
运行echo $PATH,看看你是否能找到/usr/local/binpip3 和 pip 通常在哪里

您的系统正在查看此处的一个更改/bin/pip,因此我将通过将其添加到您的文件/bin/pip3
中来修复 PATH ,以使其持续存在~/.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

解决方案 25:

我也遇到了同样的问题,但已经解决了。下面是我的解决方案。首先,当我运行 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'

因此,我进入文件 /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())

然后我认为它不在安装路径中。所以我进入 python3-pip,如下所示:

cd /.local/lib/python3.5/site-packages/pip

PS:你必须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 中的代码,问题就消失了!

PS:pip3 和 pip 在这个问题上没有区别。如果我的解决方案能解决你的问题,我会很高兴!

解决方案 26:

这对我有用!

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

希望有帮助!

解决方案 27:

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

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

解决方案 28:

从 pip._internal 导入 main

from pip._internal import main

编辑 pip 代码

sudo nano /usr/bin/pip3

解决方案 29:

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

解决方案 30:

在 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 将损坏并显示“找不到主要”错误。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用