Mit PyInstaller gebündelter Code kann kein lokal installiertes vtk-Modul importieren: ModuleNotFoundError
Ich habe versucht, pyinstaller auf die einfache Datei vtest.py anzuwenden
import vtk
print('Hello World')
auf Windows. Ich kann den Befehl ausführen
py vtest.py
ohne Problem. Aber wenn ich versuche, mit dem Befehl eine Exe zu generieren
pyinstaller vtest.py --onefile
Ich erhalte die Fehlermeldung, wenn ich versuche, die ausführbare Datei auszuführen
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
Ich habe versucht, die Hook-Datei wie hier beschrieben zu ändern , aber kein Glück.
Antworten
Pyinstaller kann diesen Import nicht erkennen und hängt ihn daher nicht an das Bundle an. Dies geschieht aufgrund weniger einfacher Importe in die Bibliotheken.
Es gibt mehr als eine Lösung:
Fügen Sie überall in Ihrem Code eine
import
Anweisung für jedes fehlende Modul hinzu. Da das Hinzufügen eines neuen Moduls dazu führen kann, dass neue Module importiert werden, benötigen Sie möglicherweise mehrere Iterationen.Fügen Sie dem
hiddenimports
Argument in der Spezifikationsdatei oder im Konsolenbefehl dieselbe Liste von Modulen hinzu . Dieser Prozess kann auch iterativ sein.
Ein weiterer Grund für fehlende Module ist, dass PyInstaller sie als Systemmodule behandelt, da sie in Verzeichnissen wie gespeichert sind /usr/lib
. Sie können überprüfen, ob dies der Fall ist, indem Sie das Modul importieren und ausdrucken .__file__
.