【问题标题】:"ImportError: cannot import name main" after upgrading to pip 10.0.0 for Python version 2.7.12 - Only one version of Python is installedPython 2.7.12 版升级到 pip 10.0.0 后出现“ImportError: cannot import name main” - 只安装了一个 Python 版本
【发布时间】:2018-09-27 14:49:53
【问题描述】:

安装软件时我的终端收到一条消息: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

【问题讨论】:

  • 你检查过这个stackoverflow.com/questions/43675074/…吗??
  • 是的。我的 Python 版本是 2.7.12。这适用于 Python 3.6。我是初学者。那么我应该使用 python 3.6 的第一个解决方案吗?
  • @AfsanAbdulaliGujarati :是的....这对我不起作用。
  • @AfsanAbdulaliGujarati :使用 pip2 而不是 pip。这对我有用。不知道将来会发生什么。 :(

标签: python python-2.7 ubuntu pip ubuntu-16.04


【解决方案1】:

TL;DR

  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 &amp;&amp; pip -V 刷新 $PATH 中的 pip 路径名。 debian 的 pip 8 仍然安装但已损坏;或
    • $ sudo apt remove python-pip &amp;&amp; hash -d pip(对于 Python 3,它是 python3-pip)——完全卸载 debian 的 pip 8,转而使用新的 pip 10。

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

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


Ubuntu 16.04 和 Python 2.7.12

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

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

在 pip 问题跟踪器的 developer thread 中更详细地讨论了此错误,包括一些建议的解决方案,例如:

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

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

  • 您可以只使用pip2 命令(或pip3 用于Python 3)而不是pip 来调用旧系统安装的pip 脚本/usr/bin/pip2,而位于@987654362 中的任何pip 启动器脚本@dir (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 版本,这将非常方便。 --user 开关仅在 pip 用于 virtualenv outside 时才需要。

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

  • 最后,您可以完全忽略这两个点以支持 APT,并从 Ubuntu 存储库安装 Python 包系统范围:
    $ apt search &lt;python-package&gt; # 例如python-pandas
    $ apt show &lt;python-package&gt; # 例如python-flask
    $ sudo apt install &lt;python-package&gt;
    python- 为前缀的包适用于 Python 2; python3- 用于 Python 3。
    通过 apt-get 安装可能是您所需要的,事实上,Ubuntu 存储库中的 python-packages 尽可能是preferred,特别是在系统依赖较重或使用system-wide 的情况下。当然,Ubuntu 存储库中的 Python 包数量(几千个!)与 PyPI 相比(并且只有一个版本)相对较少,因为任何操作系统存储库都略微落后于 PyPI 版本。但是 APT 的好处是所有 Ubuntu 提供的软件包都在 Ubuntu 中进行了集成测试,而且 apt-get 可以快速自动解决 C 扩展等重度依赖项。作为 apt 安装的一部分,您将始终获得任何所需的系统库,但使用 pip,您将拥有 no such guarantees
    但是,如果您确实需要最新(或某些较旧)软件包版本,或者只能在 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 权限),因为它interferes 与系统包管理器(apt)的操作一起可能会影响Ubuntu OS components当系统使用的 python 模块意外升级时,尤其是依赖于另一个 pip 包时。建议不要使用 Pip 更改系统范围的 Python 包,因为这些包在 Ubuntu 上由 apt-get 管理。

【讨论】:

    【解决方案2】:

    我实现了来自ImportError: cannot import name main when running pip --version command in windows7 32 bit@catalinpopescu 的响应

    查找 pip 的路径:

    $ 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
    • 不幸的是,它可能会在未来的 pip 版本中产生问题(它们将从 pip._internal 导入,然后再次更改),或者在 Ubuntu 升级时被覆盖。这整个问题是因为主流 pip @987654322 @ 从自身导入,升级时与 Debian 版本冲突。最强大的方法是卸载您已安装的 2 个点中的任何一个(主流或 debian);否则,只需重新打开一个新的 Bash 会话(终端)就足以让错误消失..
    【解决方案3】:

    尝试升级系统pip

    sudo pip install --upgrade pip

    pip install --upgrade pip

    这可能有用

    【讨论】:

    • 我没有使用 pip2 得到这个错误。后来我安装了 Python 3.6.4。现在我不再收到错误了。
    • 这不起作用。 pip 不会执行。所以 pip install -upgrade 不会运行。 (使用安装了 Py 2.7 的 ms Ubuntu)。也许我应该卸载它并切换到 3。
    猜你喜欢
    • 2018-10-02
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    相关资源
    最近更新 更多