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;