升级到 Python 版本 2.7.12 的 pip 10.0.0 后"ImportError: cannot import name main" - 仅安装了一个版本的 Python



我在安装软件时在终端中收到一条消息:You are using pip version 8.1.1, however version 10.0.0 is available. You should consider upgrading via the 'pip install --upgrade pip' command.

所以我升级了pip版本:$ pip install --upgrade pip

现在我收到此错误:

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

TL;博士

  1. "理想"的解决方案(Ubuntu/Debian 方式):
    $ python -m pip uninstall pip卸载新的 pip 10 并保留 Ubuntu/Debian 提供的修补 pip 8。对于系统范围的模块安装,请尽可能使用apt(除非您在 virtualenv 中),下面将详细介绍。在较旧的 Ubuntu/Debian 版本中,在 virtualenvs 之外使用 pip 时,请务必添加--user标志(安装到~/.local/中,自 2016 年以来默认为 python-pip 和 python3-pip)。

  2. 如果您仍然想专门使用新的pip 10,有3种快速解决方法:

    • 只需重新打开一个新的 bash 会话(一个新的终端选项卡,或键入bash) - pip 10 就可用了(见pip -V)。 Debian 的 pip 8 仍然安装,但坏了;或者
    • $ hash -d pip && pip -V刷新 $PATH 中的 pip 路径名。 Debian 的 pip 8 仍然已安装,但已损坏;或
    • $ sudo apt remove python-pip && hash -d pip(对于 Python 3 是 python3-pip)——完全卸载 Debian 的 pip 8,转而使用新的 pip 10。

注意:您将始终需要将--user标志添加到非 debian 提供的 pip 10 中,除非您在虚拟环境中!在 virtualenv 之外,你在系统范围内使用 pip 10 并不是 Ubuntu/Debian 真正支持的。永远不要sudo pip

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


Ubuntu 16.04 with Python 2.7.12

简介
具有讽刺意味的是,尽管 pip 本身建议通过终端中的pip install --upgrade pip命令进行这样的升级(呃!),但不建议在预打包的 GNU/Linux 发行版中进行升级。Ubuntu 通常希望使用 APT 包管理器进行任何系统范围的Python 模块更新/安装(包括 pip 本身),例如:
$ sudo apt-get update(从源代码重新同步 Ubuntu 软件包索引文件)
$ apt-cache search <python-package-name>(对所有可用软件包进行全文搜索)
$ apt-cache show <python-package-name>(显示软件包描述)$ sudo apt-get install python-numpy python-scipy python-matplotlib(轻松安装
用于数据科学的繁重模块,自动解决所有系统依赖关系)
$ sudo apt-get install ipython(安装您正在寻找的 IPython 笔记本)
$ sudo apt-get install python-pip(安装/升级 pip 到 Ubuntu 存储库中可用的最新版本 – 通常略微落后于 pypi.org,但没关系)如果您必须在 Ubuntu/Debian 上使用pip install命令而不是apt-get install命令,请确保它独立运行并且不会更改默认的系统范围 Python 包(切勿将sudo与 pip 一起使用)
– 更多内容见下文。

导入错误:无法导入名称主
该错误是由pip install --upgrade pip命令引起的:该命令从操作系统发行版(系统Python安装)python-pipdebian软件包中安装最新的pip版本10以及Ubuntu的默认pip版本,完全绕过Ubuntuapt子系统。它破坏了 Ubuntu 的默认 pip:来自 python-pip 的 debian 补丁启动器脚本(系统安装到/usr/bin/pip*)尝试从新安装的 pip 10 库中导入 main(),但使用不同的导入路径,因此失败。

pip 问题跟踪器的开发人员线程中更详细地讨论了此错误,包括一些建议的解决方案,例如:

  • $ hash -d pip命令:当调用hash时,pip 的完整路径名是通过搜索 $PATH 中的目录并记住来确定的。任何以前记住的路径名都将被丢弃。-d选项会导致 shell "忘记"给定包名称的记住位置;或

  • 同样,您可以简单地重新打开一个新的 bash 会话(一个新的终端选项卡)以刷新 $PATH 中的 pip 路径名;或者

  • 您可以使用pip2命令(或 Python 3 的pip3)而不是pip来调用较旧的系统安装的 pip 脚本/usr/bin/pip2,而位于$HOME/.local/bindir 中的任何 pip 启动器脚本(pip、pip2、pip2.7)将启动您新的用户安装的 pip 10 版本;

  • 您还可以将版本化的 Python 命令与-m开关结合使用来运行适当的 pip 副本,例如:$ python2 -m pip install --user SomePackage# 默认 Python 2

    $ python2.7 -m pip install --user SomePackage# 特别是 Python 2.7 如果您有多个版本的 Python
    并且需要 PyPI 针对特定 Python 版本的扩展,这将非常方便。仅当在虚拟环境之外使用 pip 时,才需要--user开关。

  • 或者,卸载两个 pip 中的一个 - 用户安装或系统安装 - 以解决冲突:
    $ python -m pip uninstall pip– 从 python-pip debian 包(Python 3 的 python3-pip)中删除手动安装的 pip 以支持以前安装的 Ubuntu 发布版本;它稍旧,但它可以从 PyPI 找到并安装最新的模块,并且默认情况下在$PATH中有一个有效的 pip 命令;或
    $ sudo apt-get remove python-pip– 卸载 Ubuntu 提供的 pip 以支持您最新的 pip 10;如果无法通过 shortpip命令访问它,只需将$HOME/.local/bin目录添加到 $PATH 环境变量以使用pip命令(见上文)。
    注意:Ubuntu 16.04 pip v8.1.1 和最新的 pip v10.0.1 产生完全相同的 PyPI 索引搜索结果,可以拉取相同的模块版本;

  • 最后,你可以完全忽略这两个点,转而支持 APT,并从 Ubuntu repo 在系统范围内安装 Python 包:$ apt search <python-package># 例如
    python-pandas
    $ apt show <python-package># 例如 python-flask
    $ sudo apt install <python-package>前缀为python-的包适用于 Python
    2;python3-适用于 Python 3。
    通过apt-get进行安装可能是你需要的,事实上,只要有可能,来自Ubuntu存储库的python包是首选,特别是在系统依赖繁重的情况下或在系统范围内使用时。当然,与 PyPI 相比,Ubuntu 存储库中的 Python 包数量(几千个!)相对较少(并且只有一个版本),因为任何操作系统存储库都略微落后于 PyPI 版本。但是APT的好处是,所有Ubuntu提供的软件包都在Ubuntu内部进行了集成测试,而且apt-get可以快速自动解决C扩展等繁重的依赖关系。作为 apt 安装的一部分,您将始终获得任何必需的系统库,但使用 pip,您没有这样的保证。
    但是,如果您确实需要最新(或某些较旧)的软件包版本,或者只能在 PyPI 上找到它,或者当模块需要隔离时,APT 可能不是一个选项;那么 pip 确实是更合适的工具。如果您在 Ubuntu 上使用pip install命令而不是apt-get install,请确保它在隔离的虚拟开发环境中运行,例如使用 virtualenv (sudo apt-get install python-virtualenv),或内置venv模块(仅在 python3 中可用),或在每用户级别(pip install --user命令选项),但不是系统范围的(永远不要sudo pip

注意:应避免使用sudo pip命令(具有root访问权限),因为它会干扰系统包管理器(apt)的操作,并且当系统使用的python模块意外升级时可能会影响Ubuntu OS组件,特别是通过对另一个pip包的依赖。建议永远不要使用 Pip 来更改系统范围的 Python 包,因为这些包由 Ubuntu 上的apt-get管理。

我暗示了来自 ImportError @catalinpopescu响应:在 windows7 32 位中运行 pip --version 命令时无法导入名称 main

查找点子的路径:

$ which pip

修改文件(选择您喜欢的编辑器):

$ sudo nano `which pip`

然后修改行@catalinpopescu说: 注释/替换行:

from pip import main
sys.exit(main())

自:

from pip import __main__
sys.exit(__main__._main())

我立即升级到Pip版本10.0.1,它似乎没有此错误。

尝试升级系统 pip

须藤点安装 --升级点子

点安装 --升级点子

这可能很有用

最新更新