pPython是一门解释型语言,边解释边执行(效率比C低,暴力脚本经常炸),通常不会进行整体地编译和链接,使用专门的解释器逐行编译解释成特定字节码,其工作流程如下:
1. 将源代码编译转换为字节码
2. 解释器执行字节码(是不是像虚拟机?)
0 1pyc文件的生成pyc 文件是 py 文件编译后生成的字节码文件,在 __pycache__ 目录中。
其目的是提高加载速度:运行时会检查字节码文件修改时间是否与源代码一致,一致则编译步骤将会被跳过,解释器直接加载 pyc 文件;否则编译保存新生成的字节码。
一般以 module 形式加载时,会生成 pyc 文件。
pyc 文件生成方式有很多,如下列举了几种:
1命令python -m test
2代码
1 生成单个 pyc 文件
py_compile 编译
import py_compile py_compile.compile(r'path/test.py')
load_module 间接加载
import impdef generate_pyc(name): fp, pathname, description = imp.find_module(name) try: imp.load_module(name, fp, pathname, description) finally: if fp: fp.close()if __name__ == '__main__': generate_pyc(input())
2 批量生成 pyc 文件
import compileall compileall.compile_dir(r'path')
0 2pyc文件格式解析
pyc文件一般由三个部分组成:
最开始 4 个字节是一个 Maigc int,标识此 pyc 的版本信息,不同的版本的 Magic 都在 python/import.c 内定义
接下来 4 个字节还是个 int,是 pyc 产生的时间(TIMESTAMP, 1970.01.01 到产生 pyc 时候的秒数)
接下来是个序列化了的 PyCodeObject,此结构在 Include/code.h 内定义,序列化方法在 python/marshal.c 内定义
康一个实例(Python2.7,010editor template 用官方 PYC.bt)
print(2333)
struct Magic magic 0A0DF303h char mtime[4] 5E6E3AB6h TYPE_CODE (63h) int co_argcount 0h int co_nlocals 0h int co_stacksize 1h int co_flags 40h struct PyObject code enum ObjType type TYPE_STRING (73h) int n 9h 64 00 00 47 48 64 01 00 struct Instruction inst[0] LOAD_CONST 0 opcode 64h oparg 0h struct Instruction inst[1] PRINT_ITEM opcode 47h struct