Ubuntu:版本16.04
Python:版本3.10.2,下载地址https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz
OpenSSL:版本1.1.1n,下载地址https://www.openssl.org/source/openssl-1.1.1n.tar.gz
从https://www.python.org/ftp/python/3.10.2/Python-3.10.2.tgz下载python源码
解压,命令:tar -xvf Python-3.10.2.tgz
进入python源码,命令:cd Python-3.10.2/
编译前配置,我将编译结果放在目录/ShenTest,命令:./configure –prefix=/ShenTest
编译make
编译结果如下
注意两处地方
Failed to build these modules:
_ctypes _hashlib _ssl
和
The necessary bits to build these optional modules were not found:
_bz2 _curses _curses_panel
_dbm _gdbm _lzma
_sqlite3 _tkinter _uuid
readline
下面详细介绍如何解决这个的
注意编译结果窗口最后一句
Could not build the ssl module!
Python requires a OpenSSL 1.1.1. or newer
这就表明ssl模块没有编译进去,需要至少1.1.1版本以上。
如果不解决这个问题,后面使用的时候可能报错。我碰到的是,后面安装包pip install,就会报ssl错误。
之所以要重新编译openssl库,是因为ubuntu自带的openssl经常版本等原因不能满足需要,修改ubuntu自带openssl很麻烦且容易导致系统问题。
下载比较新一点的openssl版本1.1.1n,下载地址https://www.openssl.org/source/openssl-1.1.1n.tar.gz
解压,命令:tar -xvf openssl-1.1.1n.tar.gz
进入openssl源码目录,命令:
cd openssl-1.1.1n/
编译前配置,为了避免一些麻烦(可能的报错),我把它编译成静态库,编译结果我放在/home/shenweihong/TmpCode/OpensslLib/,命令:./config no-shared –prefix=/home/shenweihong/TmpCode/OpensslLib/
编译命令:make
安装命令:make install
至此,openssl就编译好了,中间我没有再碰到其他错误。
回到Python源码目录,找到并打开这个文件Modules/Setup,命令:gedit Modules/Setup
因为Openssl静态编译的,在这个文件中找到这几行注释了的代码
# To statically link OpenSSL:
# _ssl _ssl.c \
# -I$(OPENSSL)/include -L$(OPENSSL)/lib \
# -l:libssl.a -Wl,--exclude-libs,libssl.a \
# -l:libcrypto.a -Wl,--exclude-libs,libcrypto.a
#_hashlib _hashopenssl.c \
# -I$(OPENSSL)/include -L$(OPENSSL)/lib \
# -l:libcrypto.a -Wl,--exclude-libs,libcrypto.a
根据之前编译的openssl路径,修改成如下
# To statically link OpenSSL:
OPENSSL=/home/shenweihong/TmpCode/OpensslLib
_ssl _ssl.c \
-I$(OPENSSL)/include -L$(OPENSSL)/lib \
-l:libssl.a -Wl,--exclude-libs,libssl.a \
-l:libcrypto.a -Wl,--exclude-libs,libcrypto.a
_hashlib _hashopenssl.c \
-I$(OPENSSL)/include -L$(OPENSSL)/lib \
-l:libcrypto.a -Wl,--exclude-libs,libcrypto.a
重新配置python源码,不重新配置不会生效,命令:./configure --prefix=/ShenTest
编译python源码,命令:make
最后编译窗口结果这么一段:
Failed to build these modules:
_ctypes
和之前比少了 _hashlib _ssl
有可能操作失败(即fail还有_hashlib _ssl),我就将命令./configure --prefix=/ShenTest改成./configure --prefix=/ShenTest --with-openssl=/home/shenweihong/TmpCode/OpensslLib,然后再make命令即可
解决了ssl模块问题,还有其他模块,编译窗口结果这么两段:
Failed to build these modules:
_ctypes
和
The necessary bits to build these optional modules were not found:
_bz2 _curses _curses_panel
_dbm _gdbm _lzma
_sqlite3 _tkinter _uuid
readline
本人验证,每一个模块对应的安装包名(sudo apt-get install 安装包名)如下
模块_ctypes,安装包名libffi-dev
模块_bz2,安装包名libbz2-dev
模块_curses和_curses_panel,安装包名libncursesw5-dev
模块_dbm和_gdbm,安装包名libgdbm-dev
模块_lzma,安装包名python-lzma和liblzma-dev
模块_sqlite3,安装包名libsqlite3-dev
模块_tkinter,安装包名tk-dev
模块_uuid,安装包名uuid-dev
模块readline,安装包名libreadline-dev
总之,执行这个命令全部安装好,命令:
sudo apt-get install libffi-dev libbz2-dev libncursesw5-dev libgdbm-dev python-lzma liblzma-dev libsqlite3-dev tk-dev uuid-dev libreadline-dev
建议这个命令执行两三次,担心中间有依赖报错,但是再执行一次可能就好。
在python源码中,清理一下,命令:make clean
再配置一次,命令:./configure –prefix=/ShenTest
编译,命令:make
这时候查看已经没有未集成或Fail的模块
安装python编译结果,命令:make install
编译python源码,没台电脑环境不一定相同,可能会碰到其他问题,本文是我操作过程的经验记录下来。
本人最近入门python,使用pycharm编辑器,选择python经常碰到各种问题,最新的pycharm不支持ubuntu自带老版本python,特别是pip install安装包的时候,报的SSL错误很麻烦,就重新研究编译python。