1.问题所在

我在centos7中安装了python3.8,在使用pip3安装一个第三方库的时候出现无法使用ssl的报错。

ssl模块确实在lib/python3.8这个目录下,为什么会报错呢,百度了一下才知道python中要使用ssl需要有openssl作为前置。

一般centos7中都是有openssl模块的,打开centos7自带的python2.7导入ssl发现正常,用python3.8导入却报错。

python获取ssl 证书 python中ssl模块_python获取ssl 证书


python获取ssl 证书 python中ssl模块_big data_02


进入python3.8解压后的目录Python-3.8.0/Modules/Setup,编辑Setup文件,去掉下面几行的注释#

python获取ssl 证书 python中ssl模块_spark_03

然后百度了解到,在编译安装完之后,执行的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.

编译安装目录下的setup.py文件保存着众多模块名,打开此文件搜索_ssl,可以看到是怎么调用ssl的,以下为其文件中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调用的地方。
下面是setup.py中报错时候的输出,很明显,是由于搜索不到ssl.h头文件或者搜索不到lib文件而导致的报错。

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()

很奇怪,明明有openssl模块却找不到ssl.h头文件,然后百度得知,openssl只包含了可执行部分,openssl-devel才包含了头文件、头文件参考、某些库文件等跟开发相关的东西。所以只安装openssl是找不到相应的头文件的。

2.解决方法

执行以下命令,同时安装上述make命令提示缺少的模块以及openssl-devel

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

执行此命令时又出现了一个问题,yum命令报错了

python获取ssl 证书 python中ssl模块_python获取ssl 证书_04


这是因为yum采用python作为命令解释器,原来系统自带的python解释器为python2.7,我之前把python软连接给改成3.8的了,导致按python3.8解析2.7的语法出错了,编辑yum文件第一行,加上2.7。#!/usr/bin/python改成#!/usr/bin/python2.7

vim /usr/bin/yum

然后又报错了,还是修改,#! /usr/bin/python改成#! /usr/bin/python2.7

vim /usr/libexec/urlgrabber-ext-down

以上模块全部安装完之后,我删掉了python3.8重新安装编译,然后安装第三方库又报错。
报错信息:ModuleNotFoundError: No module named '_ctypes' 解决方法:yum install libffi-devel 然后在执行一遍make && make install就可以安装第三方库了。