与 PyInstaller 捆绑在一起的代码无法导入本地安装的 vtk 模块:ModuleNotFoundError

Code bundled with PyInstaller cannot import a locally installed vtk module: ModuleNotFoundError

我尝试将 pyinstaller 应用于简单文件 vtest.py

import vtk

print('Hello World')

于 windows。我可以运行命令

py vtest.py

没有问题。但是当我尝试使用命令

生成一个 exe 时
pyinstaller vtest.py --onefile

当我尝试 运行 可执行文件

时出现错误
Traceback (most recent call last):
  File "vtest.py", line 1, in <module>
  File "c:\users\djame\appdata\local\programs\python\python38\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "vtk.py", line 30, in <module>
  File "importlib\__init__.py", line 127, in import_module
ModuleNotFoundError: No module named 'vtkmodules'
[11448] Failed to execute script vtest

我尝试按照概述更改挂钩文件 here 但没有成功。

Pyinstaller 无法检测到此导入,因此不会将其附加到包中。发生这种情况是因为库中的导入不太直接。

解决方案不止一种:

  • 在代码中的任何地方为每个缺失的模块添加 import 语句。由于添加新模块可能会导致它导入新的缺失模块,因此您可能需要多次迭代。

  • 将相同的模块列表添加到 spec file 或控制台命令中的 hiddenimports 参数。这个过程也可能是迭代的。

缺少模块的另一个原因是 PyInstaller 将它们视为系统模块,因为它们存储在像 /usr/lib 这样的目录中。您可以通过导入模块并打印其 .__file__.

来检查是否属于您的情况