Ubuntu16.04编译python源码

软件环境:

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

编译结果如下

Ubuntu16.04编译python源码_第1张图片
注意两处地方
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
下面详细介绍如何解决这个的


编译OpenSSL:

注意编译结果窗口最后一句

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编译集成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。

你可能感兴趣的:(python,ubuntu,linux)