关于“ImportError:无法导入名称main”升级到pip 10.0.0 for Python version 2.7.12:“ImportError:无法导入名称main”升级到pip 10.0.0 for Python 2.7.12版 – 只有一个版本的Python 已安装

“ImportError: cannot import name main” after upgrading to pip 10.0.0 for Python version 2.7.12 - Only one version of Python is installed

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

现在我收到此错误:

1
2
3
4
5
~$ 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


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

找到pip的路径:

1
$ which pip

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

1
$ sudo nano `which pip`

然后修改行@catalinpopescu说:
评论/替换行:

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

至:

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

我立即升级到Pip Version 10.0.1,看来它没有出现此错误。


TL; DR

  • '理想'解决方案(Ubuntu / Debian方式):
    $ python -m pip uninstall pip卸载新的pip 10并保留你的Ubuntu / Debian提供的补丁点8.对于系统范围的模块安装,尽可能使用apt(除非你是virtualenv),下面有更多内容。在较旧的Ubuntu / Debian版本中,在virtualenvs之外使用pip时总是添加--user标志(自2016年起安装到~/.local/,默认为python-pip和python3-pip)。

  • 如果您仍想独占使用新的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。
  • 注意:除非你在virtualenv中,否则你总是需要将--user标志添加到非debian提供的pip 10中! 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 with Python 2.7.12

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

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

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

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

  • 同样,您只需重新打开一个新的bash会话(一个新的终端选项卡)来刷新$ PATH中的pip路径名;要么

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

  • 您还可以将版本化的Python命令与-m开关结合使用来运行相应的pip副本,例如:
    $ python2 -m pip install --user SomePackage #default Python 2
    $ python2.7 -m pip install --user SomePackage#特别是Python 2.7
    如果你有几个版本的Python并且需要PyPI的扩展来获得特定的Python版本,那么这很方便。仅当在virtualenv之外使用pip时才需要--user开关。

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

  • 最后,您可以完全忽略两个点,支持APT,并在Ubuntu repo中使用以下系统安装系统范围内的Python包:
    $ apt search #例如Python - 熊猫
    $ apt show #例如Python瓶
    $ sudo apt install
    前缀为python-的软件包适用于Python 2; python3-用于Python 3。
    通过apt-get进行安装可能就是您所需要的,实际上,只要有可能,就会优先使用Ubuntu存储库中的python-packages,特别是在系统依赖性较大或系统范围内使用时。当然,与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来更改系统范围的Python包,因为这些包由Ubuntu上的apt-get管理。

    好。


    尝试升级系统点

    sudo pip install --upgrade pip

    pip install --upgrade pip

    这可能很有用