Évitez l'erreur d'exécution ModuleNotFoundError pour les exécutables générés à partir de code Python à l'aide de Pyinstaller

Contenu de l'article

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

procédure

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

Signification du message d'erreur (imagination)

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

Évitez l'erreur d'exécution ModuleNotFoundError pour les exécutables générés à partir de code Python à l'aide de Pyinstaller
Évitez l'erreur d'exécution "KeyError: '_ max_key_len_'" pour les binaires générés par PyInstaller pour le code Python à l'aide de pykakasi
[Python] pour une erreur d'instruction
Importer un enregistrement de résolution d'erreur lorsque vous touchez du code Python à partir de VSCode
Aplatir à l'aide du rendement Python de
Mémo de code personnel Python
Arrêtez Omxplayer à partir du code Python
[Python] Exemple de code pour la grammaire Python
Utilisez le code python pour détecter la posture par openpose à partir de l'image de la caméra USB