06月24, 2020

2. 源码编译 Python 3.8.3

操作系统

你可以选择任意喜欢的操作系统,Python 可以在几乎所有桌面系统和服务器系统上编译,为了方便调试,建议使用 Mac/Linux/Windows 之一。我的开发环境是一台树莓派,虽然只有信用卡大小,但可以运行功能完整的 debian 系统,常见的 Linux 工具都可以使用,只需要 200 块就可以将这个小服务器带回家。

image.png

这里不再介绍 Linux 的基本操作。如果使用 Windows 或者 Mac,推荐使用 vscode,调试非常方便。Linux 下我们借助 GCC 和 Print 完成编译和调试输出。

获取源码

最新的 Python release 版本是 3.8, 你可以从 这里 下载 tar 包,注意不要下载 exe 等安装包,我们需要的是源码包,后面会自己完成编译。

编译 Python 3.8.3

首先需要解压 tar 包,进入源码目录。

tar xvf Python-3.8.3.tgz

cd Python-3.8.3

然后运行 configure 脚本,生成 Makefile,准备编译,在此期间会检查编译器、依赖库是否符合要求,如果有缺失 configure 脚本会报错,一般情况下只要安装了 gcc、gcc-devel 和 openssl-devel 即可,特别需要注意的是,Python-3.8.3 要求 openssl 版本为 1.1,旧版本的 openssl 库存在一些 bug。

# 如果打算在本机安装 python 3.8,可以用 --prefix 参数指定安装路径,我们不打算安装,只调试,这个参数没所谓了。
./configure

# 如果提示缺少 openssl 库,请下载 openssl 1.1 源码编译安装后再重试,可以用 --with-openssl=/the/openssl/path 指定openssl 的路径。

在一些系统中 --with-openssl 参数并不好用,比较彻底的办法是直接修改生成的 Makefile 文件中的三个变量,指定 openssl 的位置:

  • OPENSSL_INCLUDES,设置为 openssl 1.1 的 include 目录;
  • OPENSSL_LIBS, 设置为 openssl 1.1 的 lib 目录。 然后就可以编译了
make

如果一切顺利,在当前目录下就可以得到可执行文件 python,我们无需安装,可以尝试直接运行刚编译出来的 Python。

./python

Look,版本是 3.8.3,确实是刚才编译出来的版本。

关注的目录

目前主要关注的目录是 Include,特别是其中 object.h,可以从中看到 Python 中最关键的对象(也是类,Python 中的类与对象界限很模糊,后面会提到)的结构。一些基本结构的定义可以在 Include/cpython/ 目录下看到。

第一阶段我们将会从 Include 目录入手,对 Python 的内存结构有一个大致的印象。

本文链接:http://www.thinkinpython.com/post/deep_py_vm_2.html

-- EOF --