Sur Mac et Windows 10, j'ai eu un ModuleNotFoundError lorsque j'ai utilisé Pyinstaller pour exécuter un fichier exécutable généré à partir de code Python. C'est un record quand il a été évité.
J'ai utilisé Pyinstaller pour générer un exécutable à partir du code Python comme suit: J'utilise pipenv.
pipenv run pyinstaller foo.py --onefile
Puisque le fichier d'exécution a été généré sous le répertoire dist, je l'ai déplacé comme suit.
./dist/foo
Une erreur d'exécution s'est produite. Message d'erreur sur 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
Message d'erreur sous 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
Ceci est une solution de contournement. Tout d'abord, lorsque vous exécutez pyinstaller pour la première fois, un fichier .spec est également généré, alors modifiez-le avec un éditeur de texte. Ajoutez le module appelé ModuleNotFoundError aux importations masquées comme suit.
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 )
Redémarrez pyinstaller avec le fichier .spec modifié comme indiqué ci-dessous.
pipenv run pyinstaller foo.spec --onefile
Le fichier exécutable a été généré, donc quand je l'ai déplacé comme suit, cela a bien fonctionné.
./dist/foo
Le message d'erreur contenait les éléments suivants:
exec(bytecode, module.__dict__)
Mon imagination est que dans le fichier exécutable généré par pyinstaller, les modules que les personnes installées avec pipenv installent ne sont pas transférés vers le code exécuté par la fonction exec. Vous devrez probablement spécifier le module dans les importations masquées dans le fichier .spec pour le code sur lequel la fonction exec s'exécute.
Recommended Posts