3
votes

cx_Freeze: ImportError: Aucun module nommé 'PyQt5.Qt'

J'essaye de créer mon application GUI en utilisant cx_Freeze . Le setup.py est le suivant:

running build
running build_exe
Traceback (most recent call last):
  File "setup.py", line 38, in <module>
options=options, executables=exe)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\dist.py", line 349, in setup
distutils.core.setup(**attrs)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\core.py", line 148, in setup
dist.run_commands()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\dist.py", line 955, in run_commands
self.run_command(cmd)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\command\build.py", line 135, in run
self.run_command(cmd_name)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\cmd.py", line 313, in run_command
self.distribution.run_command(command)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\distutils\dist.py", line 974, in run_command
cmd_obj.run()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\dist.py", line 219, in run
freezer.Freeze()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\freezer.py", line 616, in Freeze
self.finder = self._GetModuleFinder()
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\freezer.py", line 342, in _GetModuleFinder
finder.IncludePackage(name)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\finder.py", line 659, in IncludePackage
module = self._ImportModule(name, deferredImports)
  File "C:\Users\dm\AppData\Local\Programs\Python\Python36\lib\site-packages\cx_Freeze\finder.py", line 351, in _ImportModule
raise ImportError("No module named %r" % name)
ImportError: No module named 'PyQt5.Qt'

Lors de la construction, le cx_Freeze passe par l'erreur suivante. J'ai installé PyQt5.

from cx_Freeze import setup, Executable
import os
import sys

base = None

if sys.platform == 'win32':
    base = 'Win32GUI'

exe = [Executable("main.py", base=base, icon='window_icon_XbH_icon.ico')]

os.environ['TCL_LIBRARY'] = r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\tcl\\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\tcl\\tk8.6'

options = {
'build_exe': {
    'includes': ['scipy.io', 'scipy.spatial.ckdtree'],

    'include_files': [r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\DLLs\\tcl86t.dll', r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\DLLs\\tk86t.dll',
                      r'C:\\Users\\dm\\AppData\\Local\\Programs\\Python\\Python36\\Lib\\site-packages\\pyqt5_tools\\platforms\\qwindows.dll', 'window_icon_XbH_icon.ico'],
    'packages': ['pkg_resources._vendor', 'pandas', 'numpy', 'scipy', 'pydub', 'PyQt5', 'soundfile', 'sounddevice', 'cffi'],
}
}

setup(name="app", version="1.0", description='To be added',
  options=options, executables=exe)

Quelqu'un pourrait-il m'aider à comprendre ce qui ne va pas?


2 commentaires

Quelle version de cx_Freeze utilisez-vous?


@jpeg Le dernier. cx_Freeze 5.1.1


3 Réponses :


0
votes

Essayez de supprimer la ligne (inutile?)

import PyQt5.Qt

de votre script setup.py .

EDIT après que l'OP a supprimé ce ligne:

  1. Essayez de supprimer les instructions os.environ inutiles, ce sont pour tkinter , peut-être qu'elles sont en conflit. Supprimez les 3 entrées DLL dans les include_files (ne gardez que l'icône). Ajoutez 'atexit' à la liste includes , voir Exemple cx_Freeze PyQt5 .

  2. Essayez de réinstaller PyQt5 et cx_Freeze , voir les mises en garde potentielles dans ImportError: Aucun module nommé PytQt5 et Module PyQt5 et QtGui introuvable .

  3. Si cela ne fonctionne toujours pas, il y a peut-être un conflit avec un autre package utilisé dans votre application. Pour le savoir, créez un exemple minimal en utilisant uniquement PyQt5 , tel que cx_Freeze PyQt5 exemple et essayez de le figer. Si cela fonctionne, ajoutez les autres packages un par un, en vérifiant l'application figée à chaque étape.

MODIFIER II:

  1. Une autre possibilité est que vous ayez un conflit avec PyQt4 s'il est ou a été installé sur votre système. Assurez-vous de supprimer toute importation de PyQt4 de votre application et peut-être ajouter une entrée exclut: ['PyQt4'] au dictionnaire build_exe dans votre Script setup.py .


8 commentaires

Mais je suppose que vous obtenez alors un message d'erreur différent.


Je ne sais pas pourquoi cx_Freeze ne parvient pas à localiser PyQt5.


Que se passe-t-il si vous tapez import PyQt5.Qt dans une console Python?


@ M.Denis J'ai ajouté d'autres propositions à ma réponse.


La suppression de PyQt5 de la liste des packages supprime le message d'erreur. Mais j'obtiens l'erreur d'attribut suivante lors de l'exécution de l'application. L'erreur est AttributeError: function 'LLVMPY_OffsetOfElement not found .


Qu'est-ce que le retraçage complet? Quelle DLL doit fournir la fonction qui n'est pas trouvée? Essayez d'ajouter cette DLL à votre répertoire de distribution ou à son sous-répertoire lib . Votre interface graphique est-elle basée sur PyQt5 ou sur une autre bibliothèque graphique? Si oui, avez-vous essayé d'ajouter import PyQt5 à votre script d'application principal?


J'essaie toujours de comprendre cela. Mais je suis sûr qu'il s'agit d'un conflit de version. J'ai pu geler l'application la semaine dernière et maintenant je ne peux plus car j'ai réinstallé mon système d'exploitation.


Intéressant. Peut-être que votre nouveau système d'exploitation fournit des versions incompatibles de (certaines des) DLL Qt et que l'application gelée recherche ces DLL au mauvais endroit, ne les trouve pas, utilise la variable d'environnement PATH et trouve la mauvaise. Une fois que vous avez gelé votre application, essayez de faire des copies des DLL Qt qui devraient se trouver dans un sous-répertoire du répertoire de construction dans le répertoire de construction lui-même et dans son sous-répertoire lib .



1
votes

Je sais que c'est une vieille question, mais aujourd'hui, j'ai rencontré ce problème.

Voici comment je l'ai résolu:

J'ai supprimé PyQt5 et tout ce qui y était lié de mon setup.py ('{"build_exe": {"packages":' <- cette partie). Après avoir compilé mon exe. Si vous exécutez l'exe et qu'il y a une erreur de module PyQt5 manquante, alors à partir de votre répertoire site-packages (chemin similaire à celui-ci: d: \ Python37 \ Lib \ site-packages \ PyQt5 \) copiez tout le répertoire PyQt5 dans le répertoire de la bibliothèque compilée cx_freeze (exemple: .. \ build \ exe.win-amd64-3.7 \ lib \)

Maintenant, essayez d'exécuter l'exe et il ne devrait y avoir aucune erreur de module manquante, au moins liée à PyQt5. Si vous avez un autre problème de module manquant, copiez-le simplement de vos packages de site dans le répertoire lib. J'espère que cela aide.


0 commentaires

1
votes

Ne mettez pas PyQt5 en majuscule. Essayez pyqt5 dans le fichier setup.py.


0 commentaires