-
-
[原创]Python源码解析-源码编译
-
发表于: 2023-2-28 20:56 5540
-
Python源码两三年前看的了,最近发现很多都忘了。准备系统性的都记录下来,当作笔记。
1.准备工作
学习Python源码首先需要下载源码。在https://www.python.org/downloads/source/下载自己想要的版本源码。学习环境Windows11,工具:Visual
Studio Community 2019。
我们可以直接下载个最新版的源码,就Python 3.11.2可以了。
图形用户界面 描述已自动生成
2.打开Python工程
下载后直接解压打开,就可见到Python源码的目录结构。我们需要打开的是PCbuild这个文件夹。在这个文件夹下我们可以通过Visual
Studio来构建我们自己的Python程序。
图形用户界面 低可信度描述已自动生成
找到pcbuild.sln文件,打开就可。
文本 描述已自动生成
3.编译Python
直接使用Visual Studio编译出现各种报错。会发现找不到各种.h文件。
在PCbuild路径下,找到build.bat。通过命令行执行该脚本。
PS:该过程需要联网,大概需要2-3分钟可编译完成。
执行完build.bat后,Python其实就已经编译完成。
build.bat执行完成后,之前Visual
Studio报错缺失的文件也都会补充完整。后续我们就可以使用Visual
Studio修改编译源代码。
4.编译缺失的文件
在第一次使用Visual
Studio编译时,产生大量报错。那是因为有很多Python的库模块,如:zipimport、_frozen_importlib等(实际上这些模块都是py文件),未被编译成.c文件。
我们可以在源码frozen.c文件中,找到以下代码:
以_frozen_importlib模块为例,GET_CODE(importlib__bootstrap)就是_frozen_importlib模块的实际内容。
宏GET_CODE的定义是:
那_Pyget\
importlib__bootstrap_toplevel实际应该在哪呢?我们打开未进行编译的Python源码文件。找到路径Python-3.11.2\Python\deepfreeze\。该路径下只有一个README.txt。
我们可以看看README.txt的内容:
在编译完成后的Python-3.11.2\Python\deepfreeze文件中,我们可以看到生成了一个deepfreeze.c文件。
该文件内就定义了_Py_get_importlib__bootstrap_toplevel函数。
函数_Py_get_importlib__bootstrap_toplevel的返回结果是一个PyCodeObject的结构体(该结构体之后讨论)。
其中有个结构成员co_code_adaptive,它的值是一堆16进制数据。这部分数据就是_bootstrap.py编译成Python字节码(PyCodeObject结构)。
5.需要注意的
至此Python源码的编译大致完成了。基于第四点提及的缺的文件,在未来对源码进行修改编译时,如果修改了Opcode、ReadObject函数、解释器相关代码。需要使用build.bat进行编译,重新生成deepfreeze.c等文件。否则会出现编译通过,但程序执行报错的情况。