PyInstaller 的 hiddenimports 和 hooks 是什么?

5 投票
1 回答
7525 浏览
提问于 2025-04-17 18:01

我最近尝试使用pyInstaller,但有些地方我不太明白。我一直在尝试创建一些可执行文件(注意:它们都使用了numpy、scipy、OpenCV、BLAS等),但一直失败。总是缺少一些东西。所以我想问,有人能更清楚地给我解释一下什么是hiddenimports和hooks吗?还有,我该如何告诉pyInstaller我代码中所有依赖项的目录,以便它能把它们打包进最终的可执行文件里。

谢谢。

1 个回答

13

来自 pyinstaller 文档

hiddenimports

A list of modules names (relative or absolute) the module imports in some untrackable way.

有些 Python 的导入在你程序的静态分析过程中是无法追踪的。比如,你的代码可能会用 Python 代码动态生成一个模块的名字,然后再去导入这个模块。在这种情况下,pyinstaller 在分析代码时就无法知道要导入的模块名。如果你事先知道这些模块名,可以告诉 pyinstaller 一定要把这些模块包含进去。

Hooks 是一种方法,可以让你把一组隐藏的导入和其他与查找模块相关的参数打包在一起。Hooks 的命名格式是 hook-<module>.py,其中 module 是完整的模块名。例如 hook-xml.dom.py。如果你的代码中有 import xml.dom,那么这个 hook 脚本的内容会被读取,以包含任何特定于 xml.dom 的隐藏导入。

如果你创建了自己的模块,并且它需要隐藏的导入,你可以创建一个 hook 脚本,里面设置好相应的隐藏导入,然后把它存放在 PyInstaller 的 hooks 目录下。下次你用 PyInstaller 来打包一个导入了你模块的程序时,它会自动找到你的 hook 文件,并把需要的隐藏导入拉进来,这样你就不用每次都记得你模块的隐藏导入是什么了。

文档中有更多关于这些内容是如何运作的信息,但希望这些能给你提供一些背景知识。

撰写回答