PyInstaller生成的exe文件结构

  • 文件说明
  • exe格式(onefile)
  • exe格式(onedir)
  • 各文件存储格式说明
  • PyInstaller exe(onefile)执行过程
    • 主进程
    • 子进程
  • exe(onefile)和exe(onedir)比较
  • 关于CArchive和ZlibArchive

文件说明

  • 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)执行过程

主进程

  1. 启动exe
  2. 解压exe中的pkg到临时目录
  3. 启动子进程并等待完成
  4. 删除临时目录,清理环境

子进程

  1. 设置各种环境变量,初始化python环境
  2. 直接运行dependencies和scripts
  3. 返回主进程

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解释器中,没有任何硬盘操作。

你可能感兴趣的:(python相关)