文件说明
- run.exe:已经编译好的文件,负责解压exe中的资源包,创建运行环境
- pure:pyi分析用户程序及其依赖库,得到的所有需要导入的模块,但不包括dependencies
- dependencies:pyi本身,包含5个文件
- scripts:用户编写的脚本
- binary:有些python库使用了非python库,binary是这些库的集合,包括.dll和.pyd
- zipfiles:一般为空
- zipped_data:一般为空
- datas:各种资源,包括pyi识别出来的和用户主动添加的
exe格式(onefile)
- exe = run.exe + pkg
- pkg(CArchive) = pyz + dependencies + scripts + binary + zipfiles + datas + python36.dll
- pyz(ZlibArchive) = pure + zipped_data
exe格式(onedir)
- exe = run.exe + pkg
- pkg(CArchive) = pyz + dependencies + scripts
- pyz(ZlibArchive) = pure + zipped_data
各文件存储格式说明
- pure:将module加载到内存,用mashal处理,用zlib压缩后存储。
- 如果module本身是py,存储的是import后的内存模型
- 如果module本身是pyd,存储的是dll加载后的内存模型
- dependencies:同pure
- binary:zlib压缩后存储
- datas:同binary
PyInstaller exe(onefile)执行过程
主进程
- 启动exe
- 解压exe中的pkg到临时目录
- 启动子进程并等待完成
- 删除临时目录,清理环境
子进程
- 设置各种环境变量,初始化python环境
- 直接运行dependencies和scripts
- 返回主进程
exe(onefile)和exe(onedir)比较
- onedir存储的数据没有压缩,最终文件较多较大;onefile 存储的各种数据经过压缩,最终的包较小。比例大约为3:1
- 对任一python模块,两者都没有直接存储pyc或源码,而是以pyz的形式存储,并且不会解压到磁盘
- 任何python import语句都经过特殊处理,优先从pyz中加载模块。这一操作完全在内存中实现
- 如果想要优化大小,onedir模式只需要删除无用的文件就可以,onefile模式需要提供合适的命令行参数。
关于CArchive和ZlibArchive
- CArchive和ZlibArchive是PyInstaller内部的两种文件格式
- CArchive的文件扩展名是.pkg
- ZlibArchive的扩展名是.pyz
- CArchive内部包含ZlibArchive,在执行生成的exe时,CArchive里面的大多数内容会被解压到临时目录,但ZlibArchive仍然存在于内存中
- ZlibArchive中存储的是用户程序依赖的python第三方库,当程序执行到import somemodule语句时,exe会从ZlibArchive中搜索somemodule,直接载入到python解释器中,没有任何硬盘操作。
版权声明:本文为weixin_39000819原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。