Kod dołączony do PyInstaller nie może zaimportować lokalnie zainstalowanego modułu vtk: ModuleNotFoundError

Nov 20 2020

Próbowałem zastosować pyinstaller do prostego pliku vtest.py

import vtk

print('Hello World')

w oknach. Mogę uruchomić polecenie

py vtest.py

bez problemu. Ale kiedy próbuję wygenerować exe za pomocą polecenia

pyinstaller vtest.py --onefile

Otrzymuję błąd, gdy próbuję uruchomić plik wykonywalny

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

Próbowałem zmienić plik haka, jak opisano tutaj, ale bez powodzenia.

Odpowiedzi

1 KroshkaKartoshka Nov 20 2020 at 05:09

Pyinstaller nie może wykryć tego importu, więc nie dołącza go do pakietu. Dzieje się tak z powodu mniej prostego importu w bibliotekach.

Istnieje więcej niż jedno rozwiązanie:

  • W dowolnym miejscu kodu dodaj importinstrukcję dla każdego brakującego modułu. Ponieważ dodanie nowego modułu może prowadzić do nowych brakujących modułów, które importuje, możesz potrzebować kilku iteracji.

  • Dodaj tę samą listę modułów do hiddenimportsargumentu w pliku spec lub poleceniu konsoli. Ten proces może być również iteracyjny.

Innym powodem brakujących modułów jest to, że PyInstaller traktuje je jako systemowe, ponieważ są przechowywane w katalogach /usr/lib. Możesz sprawdzić, czy tak jest w Twoim przypadku, importując moduł i drukując jego plik .__file__.