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

2018-04-30 18:46:17 +08:00
 akmonde

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 无果。

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

5773 次点击
所在节点    Python
4 条回复
akmonde
2018-04-30 19:12:38 +08:00
补充一条,打印出它的路径,不知道会不会与这个有关。
```
>>> backports.__dict__
{'__name__': 'backports', '__doc__': None, '__path__': ['C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python27\\site-packages\\backports']}
```
Sylv
2018-04-30 23:01:48 +08:00
看起来你的机子有两个 backports ?
pip 安装的是在 c:\python27\lib\site-packages\backports ;
而 python 运行时 import 的是在 C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python27\\site-packages\\backports。

可以把后者移除试试。
crb912
2018-05-01 11:52:37 +08:00
1. 先确定你要导入的包(backports)在哪里,我是说绝对路径。

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

3.如果没有,可以 sys.path.append(你的包路径)。或者,把的 backports 复制到其中一个列表元素的路径下。
akmonde
2018-05-01 18:26:06 +08:00
@Sylv @crb912 感谢两位的回复,个人感觉应该是我 win 下用户权限有点问题,ssl_match_hostname 没有安装到 C:\\Users\\Administrator\*****下面去,只装到了 c:\python27\lib\site-packages\backports。
后来尝试手动复制 ssl_match_hostname 目录到 C:\\Users\\Administrator\*****下面,就能直接引用到那个包了,有点坑。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/451086

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX