wake-up-neo.net

Kein Modul benannt, wenn PyInstaller verwendet wird

Ich versuche, ein Python-Projekt unter Windows 7 mit PyInstaller zu kompilieren. Das Projekt funktioniert gut, es gibt keine Probleme, aber wenn ich versuche, es zu kompilieren, funktioniert das Ergebnis nicht. Obwohl ich beim Kompilieren keine Warnungen bekomme, befinden sich viele in der Datei warnmain.txt im Verzeichnis build: warnmain.txt

Ich verstehe diese Warnungen nicht wirklich, zum Beispiel "kein Modul mit dem Namen numpy.pi", da numpy.pi kein Modul ist, sondern eine Zahl. Ich habe nie versucht, numpy.pi zu importieren. Ich habe numpy und matplotlib explizit importiert. Außerdem verwende ich PyQt4. Ich dachte, der Fehler könnte mit diesen Bibliotheken zusammenhängen.

Ich konnte jedoch ein einfaches Skript kompilieren, das erfolgreich mit numpy arbeitet:

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_())

Erfolgreich bedeutet hier, dass die erstellte ausführbare Datei tatsächlich die gewünschte Ausgabe zeigte. Es wurde jedoch auch eine warnmain.txt-Datei erstellt, die genau die gleichen Warnungen wie zuvor enthält. Ich denke also, dass die Tatsache, dass das Kompilieren meines aktuellen Projekts keinen Erfolg bringt, nicht (oder zumindest nicht nur) mit diesen Warnungen zusammenhängt. Aber was könnte dann noch der Fehler sein? Die einzige Ausgabe während der Kompilierung sind 'INFOs' und keine der Anweisungen ist negativ.

Ich habe kein zusätzliches Hook-Verzeichnis angegeben, aber die Hooks wurden mit dem Standardverzeichnis so weit heruntergefahren, wie ich aus der Kompilierausgabe lesen konnte, z. hook-matplotlib wurde ausgeführt. Ich konnte keinen Hook für numpy sehen, ich konnte auch nicht für mein kleines Beispielskript sehen, aber dieses funktionierte. Ich habe die folgenden Importe in meinen Dateien verwendet (nicht alle in derselben, aber in verschiedenen):

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

Da PyInstaller keine Fehler/Warnungen ausgibt, konnte ich nicht herausfinden, ob das Problem mit den Bibliotheken zusammenhängt oder ob etwas anderes zu beachten ist.

22
a_guest

Das Problem waren einige Laufzeitabhängigkeiten von Matplotlib. So war das Kompilieren während des Programmlaufs in Ordnung. Weil sich das Terminal sofort schloss, wusste ich das nicht. Nachdem ich stdout und stderr in eine Datei umgeleitet hatte, konnte ich feststellen, dass ich die Bibliotheken Tkinter und FileDialog vermisst habe. Das Hinzufügen von zwei imports oben im Hauptteil hat dieses Problem gelöst.

6
a_guest

Pyinstaller sieht Importe der zweiten Ebene nicht. Wenn Sie also das Modul A importieren, erkennt pyinstaller dies. Zusätzliche Module, die in A importiert werden, werden jedoch nicht angezeigt.

In Ihren Python-Skripts müssen Sie nichts ändern. Sie können die fehlenden Importe direkt der Spezifikationsdatei..__ hinzufügen. Ändern Sie einfach die folgende Zeile:

hiddenimports=[],

zu

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

Hatte ein ähnliches Problem mit no module named FileDialog. Das habe ich mit Version 3.2 entdeckt 

pyinstaller --hidden-import FileDialog ... 

anstatt mein Hauptskript zu ändern.

8
HHest

Wenn die Angelegenheit ist, dass Sie Tkinter und Freunde nicht benötigen, weil Sie PyQt4 verwenden, sollten Sie Tkinter usw. möglichst nicht laden. Schauen Sie in/etc/matplotlibrc nach, und ändern Sie die Standardeinstellungen in PyQt4.

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

Ich hatte das gleiche Problem mit pyinstaller 3.0 und weblib. Der Import in der Hauptsache half nicht. 

Ein Upgrade auf 3.1 und das Löschen aller Build-Dateien waren hilfreich.

pip install --upgrade pyinstaller
0
fivef