Ubuntu18.04, Python3.7.4, 解决"ImportError: No module named ssl"的问题

本文由Markdown语法编辑器编辑完成。

1. 问题描述

最近因为项目中的一个模块升级,使用python的版本需要从python2.7升级到python3.7.4. 由于模块中需要用到RabbitMQ, 以及requests等模块,因此需要python支持ssl。

之前我的电脑系统是Ubuntu 14.04, python是2.7。由于python需要升级,因此我下载了Python3.7.4源码,并且按照博客(https://tecadmin.net/install-python-3-7-on-ubuntu-linuxmint/)中的方法,成功地安装了Python3.7.4。正当准备继续开发时,突然就在控制台报出了“ImportError: No module named ssl”。后来知道是,python3.7.4需要的openssl的最低版本是1.0.2及以上。而我电脑的openssl的版本是1.0.1,因此无法兼容。

后来参照一篇博客(https://blog.51cto.com/13544424/2149473)中的方法,先是下载了openssl-1.1.1-pre8的源码,然后编译安装。然后为了能够在同一台电脑上,同时兼容python2.7和python3.7.4,以及各自使用的openssl的lib,做了很多的配置文件的修改。

当所有流程都完毕后,再次运行程序,仍然报ssl not found的错误。我以为是安装完毕后,需要重启电脑才能生效。于是,就选择了重启电脑。结果,当电脑再次启动时,我的两块屏幕只有一块能够显示了,而且能够显示的那块,屏幕分辨率也不对了,几乎无法直视。这种情况,在我之前升级cuda的版本时,曾经由于安装nvidia显卡驱动时,出现过。但是,这次出现同样的问题,一定不是显卡方面的问题。

后来听同事说,系统加载时,需要用到Python的模块。我应该是在之前修改python3.7的编译配置时,影响到了python,导致在系统启动时,无法正常显示桌面。

正一筹莫展时,同事提议升级系统到Ubuntu 18.04.因为Ubuntu 18.04内置的openssl版本就是1.1.1的,也就天然解决了ssl缺失的问题。在同事的帮助下,通过更换系统盘,升级到了18.04,而且在terminal中输入openssl, 在OpenSSL> version时,显示:OpenSSL 1.1.1 11 Sep 2018。

正当我踌躇满志,准备大干一场时,发现这个系统盘中的Python是3.6的。因此,我又重复了一遍编译安装python3.7的步骤。我以为这次,应该可以直接使用了。结果问题依旧。

后来,在网上开始找解决方案。网上给出的解决方案,大部分都是先下载和安装openssl, 然后再修改python3.7的编译设置,便可以成功。和我最开始参照的博文思路一致,只是不需要在python2.7和python3.7中相互切换。相关博文:https://techglimpse.com/install-python-openssl-support-tutorial/。

只是,当我需要在python3.7.4的源码中,修改Module/Setup.dist时,需要设置SSL的位置(SSL=/usr/local/ssl)。但是,我在我的电脑中发现,在这个路径下面是没有ssl的,即这个路径压根不存在。

然后我就通过命令:whereis openssl, 来查找openssl的安装位置。结果输出的是:

whereis openssl
openssl: /usr/bin/openssl /usr/share/man/man1/openssl.1ssl.gz
whereis ssl
ssl: /usr/lib/ssl /usr/share/man/man7/ssl.7ssl.gz

总之,就是找不到openssl到底安装到哪里了,只能找到bin目录下面的可执行程序。

2. 问题解决

后来,我又在网上查找,终于在以下这篇博文中,看到了一些解决的思路。
https://www.cnblogs.com/minglee/p/9232673.html
这篇文章,也是在编译python3.7的时候,通过:

sudo ./configure --with-ssl
sudo make

在make的过程中,提示ssl以及一些其他的模块缺失,

$ 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.

后来作者通过探索和查找,发现了问题的所在。就是之前在安装openssl时,其实只是安装了可执行部分,而与开发相关的include和lib并没有安装。需要再安装openssl的另外一个包:openssl-devel (RedHat、CentOS); libssl-dev(Ubuntu).

sudo apt-get install libssl-dev

sudo make clean
sudo make
sudo make install

找到需要安装的包以后,直接通过sudo apt-get install libssl-dev, 及成功安装了带有include和lib的openssl. 此时,清除刚才python3.7编译时的临时文件,再重新make和make install. 之后,再进入python3.7的环境,import ssl时,便不再报错。

Python 3.7.4 (default, Aug 24 2019, 17:26:54) 
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import ssl
>>> 

问题到此解决了。

参考链接:

  1. Python3 ssl模块不可用的问题
    https://www.cnblogs.com/minglee/p/9232673.html
  2. Ubuntu安装openssl-devel
    https://blog.csdn.net/daxiyou/article/details/79349889

你可能感兴趣的:(技术问题和解决,Python,Linux(CentOS))