本系列作为本人@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 -}}