pyinstaller 编译踩的坑

发布时间 2023-05-25 15:02:18作者: 蝈蝈俊

这两天连续踩了 pyinstaller 的坑,表现就是代码执行没问题,但是编译后程序执行各种卡顿,错误问题。

事后分析主要是碰到了下面两类问题。

PyInstaller 不能自动检测到的依赖

一些情况下,PyInstaller 无法检测到某个依赖,继而打包出来的执行文件执行时,就会报错误:

No module named '***'

解决方法, 使用 --hidden-import 参数。它用于指定那些 PyInstaller 不能自动检测到的依赖。换句话说,这些是在你的代码中没有直接 import 的模块,但你的程序的运行仍然依赖于它们。

pyinstaller --hidden-import=pkg_resources.py2_warn myscript.py

pkg_resources.py2_warn 就是一个 "hidden import"。

通过这个参数,我们告诉 PyInstaller 在构建 myscript.py 的可执行文件时,也包含 pkg_resources.py2_warn 这个模块。

如果你有多个 hidden import,你可以多次使用 --hidden-import 参数:

pyinstaller --hidden-import=pkg_resources.py2_warn --hidden-import=another_module myscript.py

按照https://stackoverflow.com/questions/57227191/pyinstaller-hidden-import-not-found 这里的说法,需要 hidden-import 参数放在pyinstaller 命令的前面,以确保它们被正确地传递给 pyinstaller。

pyinstaller --hidden-import copy_image_util --hidden-import openpyxl.cell._writer --hidden-import win32clipboard -F Facebook自动化工具.py -i icon.ico --noconsole

--hidden-import 参数可以导入一个py文件模块么?

--hidden-import 参数用于指定在你的程序中未明确导入但运行时仍然需要的模块。这个参数的目标是模块名,而不是文件名。也就是说,你不能直接指定 .py 文件路径,而是需要指定模块名。例如,如果你的 extra.py 文件在 Python 的搜索路径(sys.path)中,你可以通过指定模块名 "extra" 来使用 --hidden-import 参数:

pyinstaller --hidden-import=extra myscript.py

这仅适用于在 Python 的搜索路径(sys.path)中的模块。如果 extra.py 文件位于其他位置,你可能需要将其所在的目录添加到 Python 的搜索路径中,或者移动 extra.py 文件到一个已经在搜索路径中的目录。

Python 的搜索路径包括当前工作目录、Python 安装目录、PYTHONPATH 环境变量中的目录,以及通过 sys.path.append() 添加的目录。

如果你的模块在一个包(package)内部,你需要使用完整的包路径,如 package.subpackage.module。例如:

pyinstaller --hidden-import=package.subpackage.extra myscript.py

类似的典型问题:

少对应的执行dll文件

比如我们 import win32clipboard 后, 我们可能会碰到 "ImportError: DLL load failed: 找不到指定的模块"的错误。

解决方案,把对应的dll放到执行目录下。

比如:下面两个dll是剪切板相关操作的dll,发帖时会用到。

  • pythoncom310.dll
  • pywintypes310.dll

当出现 ImportError: DLL load failed while importing win32clipboard: 找不到指定的模块,就是少这两个文件。

需要将在当前目录下包含下面两个文件,或者放入系统目录。

参考: