pyinstaller-hooks-contrib icon indicating copy to clipboard operation
pyinstaller-hooks-contrib copied to clipboard

Update/implement hook for VTK >= 8.2.0

Open Jmennius opened this issue 4 years ago • 7 comments

Since VTK 8.2.0 the internal structure of the package has changed significantly making existing hook obsolete (for new versions).

I've gotten my application to work with the following hook (hook-vtkmodules.py, not hook-vtkpython.py):

hiddenimports = ["vtkmodules.vtkCommonMath",
                 "vtkmodules.vtkCommonTransforms",
                 "vtkmodules.vtkCommonExecutionModel",
                 "vtkmodules.vtkIOCore",
                 "vtkmodules.vtkRenderingCore",
                 "vtkmodules.vtkFiltersCore",
                 "vtkmodules.vtkCommonMisc",
                 "vtkmodules.vtkRenderingVolumeOpenGL2",
                 "vtkmodules.vtkImagingMath",
                 ]

But this is only for my specific application (found the with --debug=imports).

Ideally, we'd provide a hook for each module (95% of which are extensions so analysis doesn't work). Considering the amount of hooks they better be provided by upstream project itself. I also believe that it is possible to automatically generate hooks based on metadata that exists in the upstream project.

Jmennius avatar Sep 28 '21 10:09 Jmennius

I've always preferred to just --hiddenimport VTK's submodules in as needed. They're not particularly hard to find and it's far easier to find and add missing modules than it is to find and remove redundantly bundled modules. If someone's really determined enough to go through every submodule and identify exactly which other submodules each one loads then write a hook for each one then that would be good but it'll be misery incarnate. (Possibly PyInstaller.utils.hooks.get_pyextension_imports() could do it programatically albeit slowly?) But failing that, I really don't want to see a brute force collect_submodules("vtkmodules") approach for VTK because it'll dump ~200MB of potentially unused DLLs into every application.

Note that the hook-vtkpython.py is not for vtk but a separate Python port of VTK. We don't have a hook for the official VTK port.

bwoodsend avatar Sep 28 '21 12:09 bwoodsend

I've always preferred to just --hiddenimport VTK's submodules in as needed. They're not particularly hard to find and it's far easier to find and add missing modules than it is to find and remove redundantly bundled modules. If someone's really determined enough to go through every submodule and identify exactly which other submodules each one loads then write a hook for each one then that would be good but it'll be misery incarnate. (Possibly PyInstaller.utils.hooks.get_pyextension_imports() could do it programatically albeit slowly?) But failing that, I really don't want to see a brute force collect_submodules("vtkmodules") approach for VTK because it'll dump ~200MB of potentially unused DLLs into every application.

Note that the hook-vtkpython.py is not for vtk but a separate Python port of VTK. We don't have a hook for the official VTK port.

Thanks for the info! I did not realize vtkpython is NOT from upstream VTK (I thought it was an earlier version). Sadly get_pyextension_imports is not in documentation, but it doesn't seem to be clean solution either.

Regarding finding a nice solution - I have idea and opened an issue to discuss it with VTK folks.

Jmennius avatar Sep 28 '21 15:09 Jmennius

That does look like a better idea. I'll chime in there.

bwoodsend avatar Sep 28 '21 16:09 bwoodsend

Any advances fixing this? Do I still need to use hidden imports?

Jaime02 avatar Sep 27 '22 23:09 Jaime02

Nothing's changed. Just --hiddenimport=vtkmodules.xxx the offending submodule every time you get the No module named vtkmodules.xxx message.

bwoodsend avatar Sep 28 '22 09:09 bwoodsend

@bwoodsend but why not update the hooks?

Jaime02 avatar Sep 28 '22 09:09 Jaime02

For the reasons outlined here and here.

bwoodsend avatar Sep 28 '22 16:09 bwoodsend