pyc文件记录了什么?

先来看一个现象

当我在C:\Users\Administrator\Documents\houdini16.5\scripts\python文件夹中创建了一个testpyc.py文件,写入如下Python代码

当我们在命令行通过python testpy.py这种句法来执行操作的时候,就直接得到了我们想要的结果,并没有生成pyc文件

而当我们在Houdini中的Pytho Shell来import使用的时候,可以看到它产生了testpyc.pyc文件

从上面的现象可以看出一点,那就是Python程序在内存中执行并不是依靠pyc文件来完成,针对一个模块文件,Python解释器会将其编译成字节码,然后交由Python虚拟机执行,这里的字节码指的是编译存储在内存中的PyCodeObject对象,这个运行时对象才是程序能正确执行的真正源头,而pyc文件只是这个对象在硬盘上的一种表现形式。

在程序运行期间,编译结果存在于内存的PyCodeObject对象中,当Python结束运行后,编译结果会被保存到pyc文件中,在下一次运行相同程序时,Python会根据pyc文件中记录的编译结果直接在内存中重新建立PyCodeObject对象,而不用再次对源文件进行编译。

PyCodeObject结构体在C源代码中有相应的声明,Python的import机制会触发pyc文件的生成,实际这不是生成pyc文件的唯一姿势。我们可以通过compile内建函数来查看这个PyCodeObject对象的一些信息

如果查看C源代码中Python\import.c内容可以看出一些生成pyc文件的端倪

mtime是pyc文件创建的时间信息,这个时间决定了pyc文件是否要重新编译,如果你在testpyc.pyc文件创建之后修改了源文件testpyc.py的话,Python会首先尝试加载testpyc.pyc,在加载过程中,如果发现testpyc.pyc文件创建时间比testpyc.py要早,就会自动重新编译testpyc.py这么个机制。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180119G00Y1L00?refer=cp_1026

扫码关注云+社区