1.问题所在
我在centos7中安装了python3.8,在使用pip3安装一个第三方库的时候出现无法使用ssl的报错。 ssl模块确实在lib/python3.8这个目录下,为什么会报错呢,百度了一下才知道python中要使用ssl需要有openssl作为前置。 一般centos7中都是有openssl模块的,打开centos7自带的python2.7导入ssl发现正常,用python3.8导入却报错。 进入python3.8解压后的目录Python-3.8.0/Modules/Setup,编辑Setup文件,去掉下面几行的注释#
然后百度了解到,在编译安装完之后,执行的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
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命令报错了 这是因为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 就可以安装第三方库了。
|