V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
akmonde
V2EX  ›  Python

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

  •  1
     
  •   akmonde · 2018-04-30 18:46:17 +08:00 · 5902 次点击
    这是一个创建于 2397 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    4 条回复    2018-05-01 18:26:06 +08:00
    akmonde
        1
    akmonde  
    OP
       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
        2
    Sylv  
       2018-04-30 23:01:48 +08:00 via iPhone
    看起来你的机子有两个 backports ?
    pip 安装的是在 c:\python27\lib\site-packages\backports ;
    而 python 运行时 import 的是在 C:\\Users\\Administrator\\AppData\\Roaming\\Python\\Python27\\site-packages\\backports。

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

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

    3.如果没有,可以 sys.path.append(你的包路径)。或者,把的 backports 复制到其中一个列表元素的路径下。
    akmonde
        4
    akmonde  
    OP
       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\*****下面,就能直接引用到那个包了,有点坑。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5719 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 01:50 · PVG 09:50 · LAX 17:50 · JFK 20:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.