python 内核分析(八):Pyc与PyCodeObject

本系列作为本人@takooctopus深入学习python机制的记录,这个博客遵照着栖迟于一丘的博客上面的流程进行的,也包含我在实际查看源码时的感想,特此列出,表示感谢。

关于pyc文件

在python运行源程序时,首先要经过编译,其会变为字节码文件,即我们所说的.pyc文件。但其中主要的是PyCodeObject


{{- code -}}

编译器对源码进行编译时,对于每个代码域,都会创建一个PyCodeObject与之对应,即文件、类或者函数。

在你运行python,使用编译语句的时候,返回的对象能直接通过这些属性访问


{{- code -}}

这里面我们就能直接得到code的属性

你要将Object写入文件,就需要


{{- code -}}

其中WFILE结构体定义


{{- code -}}

其中fp指向了最后要写入的文件。

在确定了写入的文件后,就需要向文件中写入对象:


{{- code -}}

一般的,调用了w_byte()函数进行写入缓冲区,w_flush()将缓冲区p->buf写入文件


{{- code -}}

特别的,我们在调用w_byte()时,需要传入数据类型。


{{- code -}}

因为写入文件时,所有数据都变为了字节流,我们通过开始时的这个标志,能得知一个新的对象的开始。

PyCodeObject的加载

其加载过程开始在PyMarshal_ReadObjectFromFile()函数:


{{- code -}}

实际的读入在r_object()函数中:


{{- code -}}