pip引发了ImportError错误:无法导入名为HTTPSHandler的模块。

在Ubuntu 14.04.1中安装了python-pip软件包后,我遇到了以下问题:
$ pip
Traceback (most recent call last):
  File "/usr/bin/pip", line 9, in <module>
    load_entry_point('pip==1.5.4', 'console_scripts', 'pip')()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 351, in load_entry_point
    return get_distribution(dist).load_entry_point(group, name)
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2363, in load_entry_point
    return ep.load()
  File "/usr/lib/python2.7/dist-packages/pkg_resources.py", line 2088, in load
    entry = __import__(self.module_name, globals(),globals(), ['__name__'])
  File "/usr/lib/python2.7/dist-packages/pip/__init__.py", line 10, in <module>
    from pip.util import get_installed_distributions, get_prog
  File "/usr/lib/python2.7/dist-packages/pip/util.py", line 18, in <module>
    from distlib import version
  File "/usr/lib/python2.7/dist-packages/distlib/version.py", line 14, in <module>
    from .compat import string_types
  File "/usr/lib/python2.7/dist-packages/distlib/compat.py", line 31, in <module>
    from urllib2 import (Request, urlopen, URLError, HTTPError,
ImportError: cannot import name HTTPSHandler

我检查了一下,确实安装了libssl-devpython-openssl,问题似乎是ssl模块无法导入:
>>> import ssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.7/ssl.py", line 61, in <module>
    import _ssl             # if we can't import it, let the error propagate
ImportError: No module named _ssl

一切都是从Ubuntu软件仓库安装的,所以我不知道是什么导致了这个问题。

2个回答

经过一番努力,我弄明白了。简而言之(不太确定第一个命令是否必要):
sudo apt-get install libssl-dev
sudo apt-get --reinstall install libpython2.7-stdlib

长话短说,根据Python寻找库的位置:
python -c "import sys; print sys.path"

看到在一个“健康”的其他14.04.1服务器上的/usr/lib/python2.7/lib-dynload目录下有一个_ssl.so文件,我推断导致这个问题的软件包是libpython2.7-stdlib
$ dpkg -S /usr/lib/python2.7/lib-dynload/_ssl.x86_64-linux-gnu.so
libpython2.7-stdlib:amd64: /usr/lib/python2.7/lib-dynload/_ssl.x86_64-linux-gnu.so

重新安装libpython2.7-stdlib后,原机上的文件被重新创建,问题解决了。
sudo apt-get --reinstall install libpython2.7-stdlib

(我真的不知道为什么系统中缺少了这个_ssl文件,也不知道是怎么丢失的——我不是唯一使用这台服务器的人……)

Python 3 的等效命令是 python3 -c "import sys; print(sys.path)" - Edward Moffett

你的系统可能安装了多个Python版本。 pip使用了错误的Python版本。 运行python -V查看默认要使用的Python版本。 你可能需要通过打开/usr/bin/pip文件并用你喜欢的文本编辑器更改以下内容来使用正确的版本: 将#!/usr/bin/python更改为正确的版本,例如#!/usr/bin/python2.6