pyc 是 python 的中间过程文件,可以由 python 的虚拟机运行,但是与 python 版本有关(即要求虚拟机不能跨版本)
byte 表示占用 1 个字节,long 表示占用 4 个字节,bytes 表示该字段可能占用 1 到多个字节
绿色部分是 HEAD(文件头)占前 8 个字节(03f3 0d0a 0e6b 905d)
TYPE_CODE (0x63)表示为一个 PyObject 对象
全局参数:
- 然后 4 个字节是 0x00000000,code block 的位置参数个数 co_argument
- 再接着 4 个字节是 0x00000000, code block 中的局部变量个数 co_nlocals
- 再接着 4 个字节是 0x01000000, code block 需要的栈空间 co_stacksize
- 再接着 4 个字节是 0x40000000, co_flags,这里是 64
接下来就是各种样式的 Code Block,各自含有自己的特征和内容
typedef struct {
PyObject_HEAD
int co_argcount; /* 位置参数个数 */
int co_nlocals; /* 局部变量个数 */
int co_stacksize; /* 栈大小 */
int co_flags;
PyObject *co_code; /* 字节码指令序列 */
PyObject *co_consts; /* 所有常量集合 */
PyObject *co_names; /* 所有符号名称集合 */
PyObject *co_varnames; /* 局部变量名称集合 */
PyObject *co_freevars; /* 闭包用的的变量名集合 */
PyObject *co_cellvars; /* 内部嵌套函数引用的变量名集合 */
/* The rest doesn’t count for hash/cmp */
PyObject *co_filename; /* 代码所在文件名 */
PyObject *co_name; /* 模块名|函数名|类名 */
int co_firstlineno; /* 代码块在文件中的起始行号 */
PyObject *co_lnotab; /* 字节码指令和行号的对应关系 */
void *co_zombieframe; /* for optimization only (see frameobject.c) */
} PyCodeObject;