在为Python版本2.7.12升级到pip 10.0.0之后,“ImportError:无法导入名称main”-只安装了一个Python版本

2024-03-28 15:53:54 发布

您现在位置: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

Tags: installpipimportyou终端消息软件is
3条回答

我实现了来自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

sudo pip安装--升级pip

pip安装--升级pip

这也许有用

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(对于python3,它是python3 pip)--完全卸载debian的pip 8,以支持新的pip 10。

注意:您将始终需要向非debian提供的pip 10添加--user标志,除非您在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


带有Python 2.7.12的Ubuntu 16.04

简介
具有讽刺意味的是,尽管pip自己建议通过终端中的pip install --upgrade pip命令进行这样的升级(呃!),不建议在预先打包的GNU/Linux发行版中升级它。Ubuntu通常expects使用APT package manager进行任何系统范围的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 repository中提供的最新版本——通常略落后于pypi.org,但这无关紧要)
如果您必须在Ubuntu/Debian上使用pip install命令而不是apt-get install,请确保它是独立运行的,并且不会更改默认的系统范围的Python包(永远不要将sudo与pip一起使用)–更多信息如下。

导入错误:无法导入名称main 这个错误是由pip install --upgrade pip命令引起的:它将最新的pip版本10与Ubuntu的默认pip版本一起安装在OS发行版的python-pipdebian包中(系统Python安装),完全绕过Ubuntuapt子系统。它打破了Ubuntu的默认pip:来自python pip的debian补丁启动程序脚本(系统安装到/usr/bin/pip*)试图从新安装的pip 10库中执行import main(),但导入路径不同,因此失败。

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

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

  • 类似地,您只需重新打开一个新的bash会话(一个新的终端选项卡)即可刷新$PATH中的pip路径名;或者

  • 您可以只使用pip2命令(或者Python 3的pip3)而不是pip来调用旧的系统安装的pip脚本/usr/bin/pip2,而位于$HOME/.local/bin目录(pip,pip2,pip2.7)中的任何pip启动程序脚本都将启动新的用户安装的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版本进行扩展,那么这很方便。只有在virtualenv的外部使用pip时,才需要--user开关。

  • 或者,卸载两个pip中的一个来解决冲突:
    $ python -m pip uninstall pip–删除手动安装的pip,以支持python pip debian包(python3pip用于python3)中先前安装的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索引搜索结果,并且可以提取相同的模块版本;

  • 最后,您可以完全忽略这两个pip而使用APT,并使用
    $ apt search <python-package>例如大Python
    $ apt show <python-package>例如Python瓶
    $ sudo apt install <python-package>
    前缀为python-的包适用于Python 2;前缀为python3-的包适用于Python 3。
    通过apt-get安装可能是您所需要的,事实上,只要有可能,Ubuntu存储库中的python包就是preferred,特别是在系统依赖性很强或使用system-wide时。当然,Ubuntu存储库中的Python包数量(几千!)与PyPI相比相对较小(并且只有一个版本),因为任何OS存储库都稍微落后于PyPI版本。但是APT的好处是所有Ubuntu提供的包都在Ubuntu中进行了集成测试,另外APT-get可以快速自动解决像C扩展这样的严重依赖。作为apt安装的一部分,您将始终获得任何所需的系统库,但是使用pip,您将拥有no such guarantees
    但是,如果您确实需要最新(或某些较旧)的包版本,或者只能在PyPI中找到它,或者模块需要隔离,APT可能不是一个选项;那么pip确实是更合适的工具。如果您在Ubuntu上使用pip install命令而不是apt-get install,请确保它在一个独立的虚拟开发环境中运行,例如使用virtualenvsudo apt-get install python-virtualenv)或内置的venv模块(仅在python3中可用),或者在每个用户级别(pip install --user命令选项)运行,但是在系统范围内不使用
    (永远不要使用sudo pip!)。

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

相关问题 更多 >