安装软件时,我在终端中收到一条消息: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 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; DR
“理想”解决方案(Ubuntu / Debian方式):$ python -m pip uninstall pip
卸载新的pip 10,并保留Ubuntu / Debian提供的补丁pip8。要在系统范围内安装模块,请尽可能使用apt
(除非您位于virtualenv中),有关更多信息,请参见下文。在较旧的Ubuntu / Debian版本中,在virtualenvs之外使用pip时,请始终添加--user
标志(安装到~/.local/
中,自2016年以来默认为python-pip和python3-pip)。
如果您仍然想独占使用新的pip 10,则有3种快速解决方法:
只需重新打开一个新的bash会话(一个新的终端选项卡,或键入bash
)-pip 10可用(请参阅pip -V
)。 debian的pip 8仍然安装但已损坏;要么$ hash -d pip && pip -V
刷新$ PATH中的点子路径名。 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
具有Python 2.7.12的Ubuntu 16.04
介绍:
具有讽刺意味的是,尽管pip本身建议在终端(ugh!)中明确地通过pip install --upgrade pip
命令进行此类升级,但不建议在预包装的GNU / Linux发行版中进行升级。 Ubuntu通常expects使用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一起使用)–有关此内容的更多信息。
ImportError:无法导入名称主要
该错误是由pip install --upgrade pip
命令引起的:从OS发行版(系统Python安装)中,从python-pip
debian软件包安装了最新的pip版本10和Ubuntu的默认pip版本(系统Python安装),完全绕开了Ubuntu apt
子系统。它破坏了Ubuntu的默认pip:来自python-pip(系统安装到/ usr / bin / pip *)的debian修补启动器脚本尝试从新安装的pip 10库中导入main(),但使用不同的导入路径,因此失败。
pip问题跟踪程序的developer thread中将详细讨论此错误,包括一些建议的解决方案,例如:$ hash -d pip
命令:调用hash
时,pip的完整路径名是通过在$ PATH中搜索目录来确定并记住的。任何先前记住的路径名都将被丢弃。 -d
选项使外壳程序“忘记”给定程序包名称的记住位置。要么
同样,您可以简单地重新打开一个新的bash会话(一个新的终端选项卡)来刷新$ PATH中的pip路径名;要么
您可以只使用pip2
命令(对于Python 3为pip3
)而不是pip
来调用较早的系统安装的pip脚本/usr/bin/pip2
,而任何位于$HOME/.local/bin
dir(pip,pip2)中的pip启动器脚本,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版本,那将很方便。仅当在virtualenv之外使用pip时才需要--user
开关。
或者,卸载两个点之一(user-installed或system-installed)以解决冲突:$ 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;如果不能通过短的pip
命令访问它,只需将$HOME/.local/bin
目录添加到$ PATH环境变量中即可使用pip
命令(请参见上文)。
注意:Ubuntu 16.04 pip v8.1.1和最新的pip v10.0.1产生完全相同的PyPI索引搜索结果,并且可以提取相同的模块版本;
最后,您可以完全忽略两个点,而支持APT,而可以从Ubuntu回购中在系统范围内安装Python软件包:$ apt search <python-package>
#例如python-pandas$ apt show <python-package>
#例如python烧瓶$ sudo apt install <python-package>
前缀为python-
的软件包适用于Python 2;与python3-
一起用于Python 3。
通过apt-get进行安装可能是您需要的,实际上,只要有可能,Ubuntu存储库中的python软件包都是preferred,尤其是在严重依赖系统或使用system-wide的情况下。当然,与PyPI(只有一个版本)相比,Ubuntu存储库中的Python软件包数量(几千个!)相对较小,因为任何OS存储库都略微落后于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用户访问权限),因为它与系统软件包管理器(apt)一起运行时会interferes,并且在意外升级系统使用的python模块时可能会影响Ubuntu OS components。 ,尤其是依赖于另一个pip包。建议不要使用Pip更改系统范围的Python软件包,因为这些软件包由Ubuntu上的apt-get
管理。