Python中site-packages下存在某库,导入时却无法导入?

RT,我在安装某项目时遇到了问题,其中引用了下面的库:

https://github.com/mitmproxy/mitmproxy

报错如下:

Traceback (most recent call last):
  File "test.py", line 9, in <module>
    from mitmproxy import flow, proxy, controller, options
  File "C:\Python27\lib\site-packages\mitmproxy\flow\__init__.py", line 3, in <module>
    from mitmproxy.flow import export, modules
  File "C:\Python27\lib\site-packages\mitmproxy\flow\modules.py", line 3, in <module>
    from netlib import wsgi
  File "C:\Python27\lib\site-packages\netlib\wsgi.py", line 9, in <module>
    from netlib import http, tcp, strutils
  File "C:\Python27\lib\site-packages\netlib\tcp.py", line 18, in <module>
    from backports import ssl_match_hostname
ImportError: cannot import name ssl_match_hostname

尝试安装此库:

E:\test>pip install backports.ssl_match_hostname
Requirement already satisfied: backports.ssl_match_hostname in c:\python27\lib\site-packages

在 python 命令行尝试:

>>> import backports.ssl_match_hostname
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named ssl_match_hostname
>>> import backports
>>> from backports import ssl_match_hostname
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: cannot import name ssl_match_hostname

已使用 pip 将 mitmproxy 升级到 python2.x 下最新版本,也尝试升级 backports.ssl_match_hostname 无果。

求解各位大佬这是为何,在线等....


Python中site-packages下存在某库,导入时却无法导入?

5 回复

补充一条,打印出它的路径,不知道会不会与这个有关。
<br>&gt;&gt;&gt; backports.__dict__<br>{'__name__': 'backports', '__doc__': None, '__path__': ['C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python27\\site-packages\\backports']}<br>


这个问题挺常见的,一般就几个原因,我帮你捋一下。

1. 环境搞混了 最常见的就是你有多个Python环境(比如系统Python、Anaconda、虚拟环境),pip install装到了一个环境,但运行代码用的是另一个。用下面命令检查一下:

# 检查当前Python路径
which python
# 或
python -c "import sys; print(sys.executable)"

# 检查包的安装位置
python -m pip show 包名 | grep Location

如果两个路径对不上,那就是环境问题。要么激活正确的环境,要么用对应环境的pip安装。

2. 包损坏了 有时候安装过程出问题,文件不完整。直接重装:

pip uninstall 包名
pip install --force-reinstall 包名

3. init.py文件问题 如果是自己开发的包或者老式包,确保目录里有__init__.py文件(可以是空的)。没有这个文件Python不认那是包。

4. 路径问题 检查sys.path

import sys
print(sys.path)

看看你的site-packages目录在不在里面。如果不在,可能是Python安装有问题,或者有特殊的路径配置。

5. 包名和导入名不一致 有些包安装名和导入名不一样,比如pip install python-dateutil,但导入是import dateutil。用pip list看看你到底装了什么。

快速排查步骤:

  1. 在终端直接python -c "import 包名",如果成功,就是你IDE或脚本的环境问题
  2. 如果失败,用上面方法检查环境和安装情况

总结:先确认环境和安装路径是否一致。

看起来你的机子有两个 backports ?
pip 安装的是在 c:\python27\lib\site-packages\backports ;
而 python 运行时 import 的是在 C:\Users\Administrator\AppData\Roaming\Python\Python27\site-packages\backports。

可以把后者移除试试。

  1. 先确定你要导入的包(backports)在哪里,我是说绝对路径。

    2.在你的代码前面放上
    import sys
    print(sys.path)
    它会返回一个列表,里面囊括了解释器会寻找的全部路径,你看看列表里有没有第一步你的那个绝对路径。

    3.如果没有,可以 sys.path.append(你的包路径)。或者,把的 backports 复制到其中一个列表元素的路径下。

感谢两位的回复,个人感觉应该是我 win 下用户权限有点问题,ssl_match_hostname 没有安装到 C:\Users\Administrator*****下面去,只装到了 c:\python27\lib\site-packages\backports。
后来尝试手动复制 ssl_match_hostname 目录到 C:\Users\Administrator*****下面,就能直接引用到那个包了,有点坑。

回到顶部