《python源码剖析》笔记-python代码对象

PyCodeObject。

pyc文件的读入:

读入pyc文件的部分可以参考python的importlib。在3.6版本中,读入pyc文件的逻辑在importlib/_bbotstrap_external.py中。pyc文件中除了存储codeobject之外,还存储了头部信息。
对头部信息的判断在_validate_bytecode_header中:

magic = data[:4]
raw_timestamp = data[4:8]
raw_size = data[8:12]

前四字节为Magic Number,用来对pyc文件的版本进行校验。_validate_bytecode_header在SourceLoader类的get_code中被调用。get_code中先使用_validate_bytecode_header检查头部,之后使用_compile_bytecode处理,而_compile_bytecode中则是调用了marshal.loads。marshal实现的是对象的序列化和反序列化操作,marshal.load是将一个序列化的对象读取到内存中。

参照这一过程,可以如下实现读取pyc文件的功能:

def read_pyc(pyc_filename):
    fp = open(pyc_filename, "rb")
    magic = fp.read(4)
    raw_timestamp = fp.read(4)
    raw_size = fp.read(4)
    c = marshal.load(fp)
    return c

这一函数忽略了检查过程,跳过文件头部之后读取codeobject。读取到codeobject之后,可以用dir函数查看其属性,之后读取对应属性并输出。

其他部分,3中与2中差别不大。3中的codeobject的属性与书中一致,dis模块也依然在。用于序列化和反序列化的marshal模块实现因为不是一个关键因素,就未与书中进行对比了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,973评论 19 139
  • 运行程序 当在shell中敲入python xx.py运行 Python 程序时,就是激活了 Python 解释器...
    超net阅读 4,467评论 0 2
  • C/C++输入输出流总结 前两天写C++实习作业,突然发现I/O是那么的陌生,打了好长时间的文件都没有打开,今天终...
    LuckTime阅读 1,753评论 0 6
  • JAVA序列化机制的深入研究 对象序列化的最主要的用处就是在传递,和保存对象(object)的时候,保证对象的完整...
    时待吾阅读 10,923评论 0 24
  • 爱情有时像一朵含苞待放的花,需要时间才会盛开! 有这么一句话 当你问一个男人 爱不爱你的时候 你就输了 不要总是想...
    一只大熊正向你走来阅读 289评论 0 2