Vermeiden Sie Laufzeitfehler ModuleNotFoundError für ausführbare Dateien, die mit Pyinstaller aus Python-Code generiert wurden

Artikelinhalt

Unter Mac und Windows 10 wurde ein ModuleNotFoundError angezeigt, als ich mit Pyinstaller eine aus Python-Code generierte ausführbare Datei ausführte. Es ist ein Rekord, als es vermieden wurde.

Verfahren

Ich habe Pyinstaller verwendet, um eine ausführbare Datei aus Python-Code wie folgt zu generieren: Ich benutze pipenv.


pipenv run pyinstaller foo.py --onefile

Da die Ausführungsdatei im Verzeichnis dist generiert wurde, habe ich sie wie folgt verschoben.


./dist/foo

Ein Laufzeitfehler ist aufgetreten. Fehlermeldung auf dem Mac:

Traceback (most recent call last):
  File "site-packages/PyInstaller/loader/rthooks/pyi_rth_pkgres.py", line 13, in <module>
  File "/Users/username/.local/share/virtualenvs/foo_project-dA2KfCBr/lib/python3.7/site-packages/PyInstaller/loader/pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages/pkg_resources/__init__.py", line 86, in <module>
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[5125] Failed to execute script pyi_rth_pkgres

Fehlermeldung unter Windows:

Traceback (most recent call last):
  File "site-packages\PyInstaller\loader\rthooks\pyi_rth_pkgres.py", line 13, in <module>
  File "c:\users\username\.virtualenvs\foo_project-uuzswlzx\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 623, in exec_module
    exec(bytecode, module.__dict__)
  File "site-packages\pkg_resources\__init__.py", line 86, in <module>
ModuleNotFoundError: No module named 'pkg_resources.py2_warn'
[14256] Failed to execute script pyi_rth_pkgres

Dies ist eine Problemumgehung. Wenn Sie pyinstaller zum ersten Mal ausführen, wird auch eine .spec-Datei generiert. Bearbeiten Sie sie daher mit einem Texteditor. Fügen Sie das Modul mit dem Namen ModuleNotFoundError wie folgt zu versteckten Importen hinzu.

foo.spec



# -*- mode: python ; coding: utf-8 -*-

block_cipher = None


a = Analysis(['foo.py'],
             pathex=['/Users/username/PycharmProjects/n/foo_project'],
             binaries=[],
             datas=[],
-              hiddenimports=[],
+              hiddenimports=['pkg_resources.py2_warn'],
             hookspath=[],
             runtime_hooks=[],
             excludes=[],
             win_no_prefer_redirects=False,
             win_private_assemblies=False,
             cipher=block_cipher,
             noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
             cipher=block_cipher)
exe = EXE(pyz,
          a.scripts,
          a.binaries,
          a.zipfiles,
          a.datas,
          [],
          name='foo',
          debug=False,
          bootloader_ignore_signals=False,
          strip=False,
          upx=True,
          upx_exclude=[],
          runtime_tmpdir=None,
          console=True )

Starten Sie pyinstaller erneut mit der bearbeiteten .spec-Datei, wie unten gezeigt.

pipenv run pyinstaller foo.spec --onefile

Die ausführbare Datei wurde generiert. Als ich sie wie folgt verschob, funktionierte sie einwandfrei.

./dist/foo

Bedeutung der Fehlermeldung (Vorstellung)

Die Fehlermeldung enthielt Folgendes:

exec(bytecode, module.__dict__)

Ich stelle mir vor, dass in der von pyinstaller generierten ausführbaren Datei die Module, die mit pipenv install installiert wurden, nicht auf den Code übertragen werden, den die exec-Funktion ausführt. Sie müssen wahrscheinlich das Modul in versteckten Importen in der .spec-Datei für den Code angeben, auf dem die exec-Funktion ausgeführt wird.

Recommended Posts

Vermeiden Sie Laufzeitfehler ModuleNotFoundError für ausführbare Dateien, die mit Pyinstaller aus Python-Code generiert wurden
Vermeiden Sie den Laufzeitfehler "KeyError: '_ max_key_len_'" für Binärdateien, die von PyInstaller für Python-Code mit pykakasi generiert wurden
[Python] für Anweisungsfehler
Importieren Sie einen Fehlerbehebungsdatensatz, wenn Sie Python-Code aus VSCode berühren
Mit Python abflachen
Persönliches Python-Code-Memo
Stoppen Sie Omxplayer vom Python-Code
[Python] Beispielcode für die Python-Grammatik
Verwenden Sie Python-Code, um die Körperhaltung durch Öffnen des USB-Kamerabilds zu erkennen