• Python3 ssl模块不可用的问题


    编译安装完Python3之后,使用pip来安装python库,发现了如下报错:

    $ pip install numpy
    pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
    Collecting numpy
      Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/numpy/
      Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/numpy/
      Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/numpy/
      Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/numpy/
      Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)': /simple/numpy/
      Could not fetch URL https://pypi.python.org/simple/numpy/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='pypi.python.org', port=443): Max retries exceeded with url: /simple/numpy/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.",)) - skipping
      Could not find a version that satisfies the requirement numpy (from versions: )
    No matching distribution found for numpy

    网上说了一种解决方案,是在./configure 的时候,加上--with-ssl选项,然后重新编译安装,尝试了下:

    $ ./configure --with-ssl
    ... ...
    configure: WARNING: unrecognized options: --with-ssl
    ... ...

    出了个警告:不可识别的--with-ssl选项。

    ./configure --help看了下确实也没发现这个选项,估计是版本不一致,不大想折腾这个版本问题了,决定换个思路。

    尝试安装openssl:

    $ sudo yum install openssl

    安装成功之后,重新编译安装,依旧报这个错,但是在make的时候有了一些发现:

    $ make
    ... ...
    Python build finished successfully!
    The necessary bits to build these optional modules were not found:
    _bz2                  _curses               _curses_panel      
    _dbm                  _gdbm                 _lzma              
    _sqlite3              _ssl                  _tkinter           
    readline                                    
    To find the necessary bits, look in setup.py in detect_modules() for the module's name.

    可以看到,这里虽然make成功了,但是报了很多模块缺失,查看下编译安装目录下的setup.py,搜索_ssl,可以定位到如下代码:

     843         # Detect SSL support for the socket module (via _ssl)
     844         search_for_ssl_incs_in = [
     845                               '/usr/local/ssl/include',
     846                               '/usr/contrib/ssl/include/'
     847                              ]
     848         ssl_incs = find_file('openssl/ssl.h', inc_dirs,
     849                              search_for_ssl_incs_in
     850                              )
     851         if ssl_incs is not None:
     852             krb5_h = find_file('krb5.h', inc_dirs,
     853                                ['/usr/kerberos/include'])
     854             if krb5_h:
     855                 ssl_incs += krb5_h
     856         ssl_libs = find_library_file(self.compiler, 'ssl',lib_dirs,
     857                                      ['/usr/local/ssl/lib',
     858                                       '/usr/contrib/ssl/lib/'
     859                                      ] )
     860 
     861         if (ssl_incs is not None and
     862             ssl_libs is not None):
     863             exts.append( Extension('_ssl', ['_ssl.c'],
     864                                    include_dirs = ssl_incs,
     865                                    library_dirs = ssl_libs,
     866                                    libraries = ['ssl', 'crypto'],
     867                                    depends = ['socketmodule.h']), )
     868         else:
     869             missing.append('_ssl')

    可以看到,setup.py会在'/usr/local/ssl/include', '/usr/contrib/ssl/include/' 这两个目录里面搜索'openssl/ssl.h' 这个头文件,然后会在 '/usr/local/ssl/lib' 和 '/usr/contrib/ssl/lib/' 之中搜索 ssl 的 lib文件,搜索不到,会将_ssl加入missing这个数组里面,然后寻找missing调用的地方:

     313         if missing:
     314             print()
     315             print("Python build finished successfully!")
     316             print("The necessary bits to build these optional modules were not "
     317                   "found:")
     318             print_three_column(missing)
     319             print("To find the necessary bits, look in setup.py in"
     320                   " detect_modules() for the module's name.")
     321             print()

    找到了上面报错时候的输出,很明显,是由于搜索不到ssl.h头文件或者搜索不到lib文件而导致的报错,但是我刚刚明明是装了openssl的啊,为啥还会报找不到呢?手动搜索下:

    $ sudo find / -name ssl.h

    没找到ssl.h,折腾了一番之后,找到了如下命令:

    $ sudo yum install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel 

    可以看到,这个命令安装的是openssl-devel,与我之前安装的openssl有所不同,查阅资料之后发现,openssl只包含了可执行部分,openssl-devel才包含了头文件、头文件参考、某些库文件等跟开发相关的东西。所以只安装openssl是找不到相应的头文件的,安装完之后,再次编译:

    $ make clean
    $ make
    ... ...
    Python build finished successfully!
    The necessary bits to build these optional modules were not found:
    _dbm                  _gdbm                 _lzma              
    To find the necessary bits, look in setup.py in detect_modules() for the module's name.

    果然发现,缺失的模块少了很多。

    继续安装:

    $ sudo make install

    安装完之后,重新执行pip:

    $ pip install numpy
    Collecting numpy
      Downloading https://files.pythonhosted.org/packages/68/1e/116ad560de97694e2d0c1843a7a0075cc9f49e922454d32f49a80eb6f1f2/numpy-1.14.5-cp36-cp36m-manylinux1_x86_64.whl (12.2MB)
        6% |██                              | 747kB 10kB/s eta 0:17:52

    至此,pip安装报错的问题解决。

  • 相关阅读:
    上篇用到的matcher函数
    lambdaj学习
    Redis高级应用——2
    Redis入门
    从gitee 下载代码到本地
    CSS中对图片(background)的一些设置心得总结
    nodejs 安装Ionic 和cordova
    Spring MVC内容协商机制详解
    基于Servlet3.0的编程式SpringMVC实例详解
    基于Junit的Spring集成测试方法
  • 原文地址:https://www.cnblogs.com/minglee/p/9232673.html
Copyright © 2020-2023  润新知