pyinstaller
1、PyInstaller 打包原理
1、把 Python 解释器和所需的库打包进去。
2、把 .py 文件编译成 .pyc(字节码)。
3、在 exe 内部有一个类似压缩包的结构,存放这些 .pyc 文件。
4、exe 启动时,会解压并运行这些 .pyc 文件。
5、所以 exe 中其实是有 Python 字节码的。
2、还原py源码
提取 exe 内部的 pyc 文件
pyinstxtractor.py
https://github.com/NShisan/pyinstxtractor
反编译 pyc 文件
使用 Python 的反编译工具,如:
uncompyle6
https://github.com/rocky/python-uncompyle6
decompyle3
https://github.com/rocky/python-decompile3
PyInstaller打包 exe 的结构
引导程序(Bootloader)
这是一个用 C 写的可执行程序,占用 exe 的最前端。
1、初始化 Python 解释器
2、解压内置的资源
3、加载依赖库
4、最后运行 Python 脚本(字节码)
PYZ 压缩包
这个是一个内部 zip 格式文件,里面包含所有 Python .pyc 文件和依赖模块。本质上就是一个字节码包。
依赖的 DLL / 动态库
Python 运行时库(比如 python39.dll)以及你程序依赖的 C 扩展库。
pyinstaller 打包exe的启动流程
Bootloader 启动
先在内存里创建一个临时环境。
解压内置文件
PyInstaller 默认不会把文件写在打包的 exe 同目录,而是写到 临时目录:
Windows: %TEMP%_MEIxxxxxx
Linux/macOS: /tmp/_MEIxxxxxx/
这里 _MEIxxxxxx 是 PyInstaller 自动生成的临时文件夹名。
exe 会把 PYZ 包解压到这个目录,包括 .pyc 文件、依赖 DLL、资源文件等。
运行 Python 字节码
Bootloader 会调用 Python 解释器直接执行 .pyc 文件。