web-dev-qa-db-fra.com

Aucun module nommé lors de l'utilisation de PyInstaller

J'essaie de compiler un projet Python sous Windows 7 en utilisant PyInstaller. Le projet fonctionne bien, il n'y a pas de problèmes, cependant, lorsque j'essaie de le compiler, le résultat ne fonctionne pas. Bien que je n’obtienne aucun avertissement lors de la compilation, le fichier warnmain.txt du répertoire build contient de nombreux fichiers: warnmain.txt

Je ne comprends pas vraiment ces avertissements, par exemple "pas de module nommé numpy.pi" puisque numpy.pi n'est pas un module mais un nombre. Je n'ai jamais essayé d'importer numpy.pi. J'ai importé numpy et matplotlib explicitement. De plus, j'utilise PyQt4. Je pensais que l'erreur pourrait être liée à ces bibliothèques.

Cependant, j'ai pu compiler un script simple qui utilise numpy avec succès:

import sys
from PyQt4 import QtGui, QtCore
import numpy as np

class MainWindow(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.pb = QtGui.QPushButton(str(np.pi), self)

app = QtGui.QApplication(sys.argv)
main = MainWindow()
main.show()
sys.exit(app.exec_())

Succès signifie ici que le fichier exécutable créé a réellement affiché le résultat souhaité. Cependant, un fichier warnmain.txt créé contient exactement les mêmes "avertissements" que le précédent. Donc, je suppose que le fait que la compilation de mon projet actuel ne donne aucun succès n’est pas (ou du moins pas seulement) lié à ces avertissements. Mais quoi d'autre pourrait être l'erreur alors? Les seules informations générées lors de la compilation sont 'INFO' et aucune des déclarations n'est négative.

Je n'ai pas spécifié de répertoire de hook supplémentaire, mais les hooks utilisaient le répertoire par défaut aussi loin que je pouvais lire à partir de la sortie de compilation, par exemple. hook-matplotlib a été exécuté. Je ne pouvais voir aucun crochet pour numpy ni pour mon petit exemple de script, mais celui-ci fonctionnait. J'ai utilisé les importations suivantes dans mes fichiers (pas toutes dans le même mais dans des fichiers différents):

import numpy as np
import matplotlib.pyplot as ppl
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg import NavigationToolbar2QTAgg as NavigationToolbar
from PyQt4 import QtGui, QtCore
import json
import sys
import numpy # added this one later
import matplotlib # added this one later

Étant donné que PyInstaller ne génère aucune erreur ni aucun avertissement, je ne peux pas savoir si le problème est lié aux bibliothèques ou s'il y a autre chose à prendre en compte.

22
a_guest

Le problème était lié à certaines dépendances d'exécution de matplotlib. Ainsi, la compilation s’est bien passée lors de l’exécution du programme a généré quelques erreurs. Parce que le terminal s'est fermé tout de suite, je ne m'en suis pas rendu compte. Après avoir redirigé stdout et stderr dans un fichier, je me suis aperçu que les bibliothèques Tkinter et FileDialog étaient manquantes. L’ajout de deux imports au sommet de la console a résolu ce problème.

6
a_guest

Pyinstaller ne verra pas les importations de deuxième niveau . Donc, si vous importez le module A, pyinstaller le voit. Mais tout module supplémentaire importé dans UN ne sera pas visible.

Il n'y a pas besoin de changer quoi que ce soit dans vos scripts python. Vous pouvez directement ajouter les importations manquantes dans le fichier spec ..__ Il suffit de modifier la ligne suivante:

hiddenimports=[],

à

hiddenimports=["Tkinter", "FileDialog"],
9
user1251007

Avait un problème similaire avec no module named FileDialog. Découvert qu'avec la version 3.2, je pourrais utiliser 

pyinstaller --hidden-import FileDialog ... 

au lieu de modifier mon script principal.

8
HHest

Si le problème est que vous n'avez pas besoin de Tkinter et de vos amis parce que vous utilisez PyQt4, il peut être préférable d'éviter de charger Tkinter, etc. Regardez dans/etc/matplotlibrc et changez les valeurs par défaut en PyQt4, voir les lignes "modifiées" ci-dessous:

#### CONFIGURATION BEGINS HERE

# The default backend; one of GTK GTKAgg GTKCairo GTK3Agg GTK3Cairo
# CocoaAgg MacOSX Qt4Agg Qt5Agg TkAgg WX WXAgg Agg Cairo GDK PS PDF SVG
# Template.
# You can also deploy your own backend outside of matplotlib by
# referring to the module name (which must be in the PYTHONPATH) as
# 'module://my_backend'.

#modified 
#backend      : TkAgg
backend      : Qt4Agg


# If you are using the Qt4Agg backend, you can choose here
# to use the PyQt4 bindings or the newer PySide bindings to
# the underlying Qt4 toolkit.

#modified 
#backend.qt4 : PyQt4        # PyQt4 | PySide
backend.qt4 : PyQt4        # PyQt4 | PySide
1
ullix

J'ai eu le même problème avec pyinstaller 3.0 et weblib. L'importation dans le principal n'a pas aidé. 

La mise à niveau vers la version 3.1 et la suppression de tous les fichiers de construction ont été utiles.

pip install --upgrade pyinstaller
0
fivef