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.
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
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