• 发生时间:2022-05-25
  • 问题描述:打包 Python 程序时,已经使用 pip 安装所需的依赖;但使用 pyinstaller 打包后,运行二进制文件仍然报「找不到依赖」的错误。
  • 问题类别:软件开发
  • 原因分析:
    • 安装依赖前,曾经用过 pyinstaller 进行打包,并在 pcba_tool 目录下生成 build 目录。
    • 安装依赖后,pyinstaller 检查到存在 build 目录并且里面有中间结果,就不会重新编译代码,导致新安装的依赖没有被打包进去。
  • 解决方案:有两种解决方案:
    • 方案1:先删除 build 目录,再使用 pyinstaller 编译打包。
    • 方案2:使用 pyinstaller 时添加 --clean 选项,这时也会先清除临时结果再进行编译打包。
  • 实施结果:采用方案 2 重新打包,打包后可以正常运行二进制文件。
  • 经验总结:每次使用 pyinstaller 打包前都统一删除 build 目录,或统一添加 --clean 选项,可以避免某次添加依赖后没被打包进去的问题。

关于 pyinstaller 打包后的残留文件的说明

使用 pyinstaller 打包后,会在当前目录下生成 __pycache__builddist 目录及 .spec 文件。

下面是对这些文件/目录的一些说明:

  • pyinstaller 每次打包结束时会提醒是否删除 dist 目录,如果你不想提醒,可以添加 --noconfirm 参数, 或者先手动删除该目录。
  • 就这个问题而言,打包前删不删除 __pycache__ 目录和 .spec 文件没有影响,而 build 目录必须先删除。
  • 为简便起见,可以每次打包前都统一删除这些目录或文件。