每当我试图使用pip安装任何包时,我都会得到这个导入错误:
guru@guru-notebook:~$ pip3 install numpy
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'
guru@guru-notebook:~$ cat `which pip3`
#!/usr/bin/python3
# GENERATED BY DEBIAN
import sys
# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import main
if __name__ == '__main__':
sys.exit(main())
它之前工作得很好,我不知道为什么它会抛出这个错误。
我已经搜索了这个错误,但找不到任何方法来修复它。
如果你需要进一步的细节,请让我知道,我会更新我的问题。
您一定是无意中升级了您的系统pip(可能是通过sudo pip install pip—upgrade之类的程序)
皮普10。X调整它内部的位置。您看到的pip3命令是由您的包维护者提供的(想必debian基于这里?),而不是由pip管理的文件。
您可以在pip的问题跟踪器上阅读更多有关此的信息
您可能不希望升级您的系统pip,而是使用virtualenv。
要恢复pip3二进制文件,您需要sudo python3 -m pip uninstall pip && sudo apt install python3-pip—重新安装。
如果您想继续在“不受支持的领域”(在系统包管理器之外升级系统包),您可能可以使用python3 -m pip…而不是pip3。
我也有同样的问题,但我已经解决了。这是我的解决方案。
首先,当我运行pip install something时,错误如下所示:
Traceback (most recent call last):
File "/usr/bin/pip3", line 9, in <module>
from pip import main
ImportError: cannot import name 'main'
因此,我cd到文件/usr/bin/和cat pip3中查看其中的代码。我看到了这一点:
#!/usr/bin/python3
# GENERATED BY DEBIAN
import sys
# Run the main entry point, similarly to how setuptools does it, but because
# we didn't install the actual entry point from setup.py, don't use the
# pkg_resources API.
from pip import main
if __name__ == '__main__':
sys.exit(main())
然后我认为它不在安装路径中。所以我cd到python3-pip,像这样:
cd /.local/lib/python3.5/site-packages/pip
附注:你必须在电脑里按正确的方向输入cd
然后我cat文件来查看差异(你可以使用其他操作来查看代码):
cat __main__.py
我看到了这个:
from __future__ import absolute_import
import os
import sys
# If we are running from a wheel, add the wheel to sys.path
# This allows the usage python pip-*.whl/pip install pip-*.whl
if __package__ == '':
# __file__ is pip-*.whl/pip/__main__.py
# first dirname call strips of '/__main__.py', second strips off '/pip'
# Resulting path is the name of the wheel itself
# Add that to sys.path so we can import pip
path = os.path.dirname(os.path.dirname(__file__))
sys.path.insert(0, path)
from pip._internal import main as _main # isort:skip # noqa
if __name__ == '__main__':
sys.exit(_main())
所以,你能看出区别吗?我可以弄清楚,我必须使该文件与/usr/bin/pip3中的文件相同
因此,我复制了/.local/lib/python3.5/site-packages/pip中的代码来替换/usr/bin/pip3中的代码
问题就消失了!
注:pip3和pip在这个问题上没有区别。
如果我的解决方案解决了你的问题,我会很高兴!
我使用pip3修复错误的方法是:
Sudo cp -v /usr/local/bin/pip3 /usr/bin/pip3
所有的工作原理:
demon@UbuntuHP:~$ pip -V
pip 10.0.1 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)
demon@UbuntuHP:~$ pip2 -V
pip 10.0.1 from /home/demon/.local/lib/python2.7/site-packages/pip (python 2.7)
demon@UbuntuHP:~$ pip3 -V
pip 10.0.1 from /usr/local/lib/python3.5/dist-packages/pip (python 3.5)
也许新的10.0.1版本的pip没有更新/usr/bin中的二进制文件?(但事实似乎并非如此)
编辑:同样的问题出现在Ubuntu 18.04中。我发现的最佳解决方案是从/home/<user/链接pip二进制文件。Local /bin到/usr/ Local /bin或/usr/bin(取决于你的偏好),如下所示:
ln -sv /home/<user>/.local/bin/pip /usr/local/bin/pip
ln -sv /home/<user>/.local/bin/pip2 /usr/local/bin/pip2
ln -sv /home/<user>/.local/bin/pip2.7 /usr/local/bin/pip2.7
ln -sv /home/<user>/.local/bin/pip3 /usr/local/bin/pip3
ln -sv /home/<user>/.local/bin/pip3.6 /usr/local/bin/pip3.6
注意:将<用户>替换为当前运行用户
相关版本(最新)如下:
3.6版本:
/home/demon/.local/lib/python3.6/site-packages/pip (python 3.6)
2.7版本:
/home/demon/.local/lib/python2.7/site-packages/pip (python 2.7)