首页
社区
课程
招聘
[原创]Python源码解析-源码编译
发表于: 2023-2-28 20:56 5540

[原创]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等文件。否则会出现编译通过,但程序执行报错的情况。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//