Ich führe WinPython 3.4.4.3 mit Pyinstaller 3.2 aus (erhalten über Pip Install Pyinstaller).
Jetzt habe ich einen wirklich einfachen Qt4-Code, den ich in EXE konvertieren möchte, und ein Problem, das ich nicht lösen kann.
Der Code:
import sys
import math
from PyQt4 import QtGui, QtCore
import SMui
import numpy as np
from scipy.interpolate import InterpolatedUnivariateSpline
class SomeCalculation(QtGui.QMainWindow, SMui.Ui_MainWindow):
def __init__(self):
super(self.__class__, self).__init__()
self.setupUi(self)
self.setWindowTitle('Some Calculation')
self.calculate.clicked.connect(self.some_math)
def some_math(self):
a_diameter=self.a_diameter.value()
b_diameter=self.b_diameter.value()
complement=self.complement.value()
angle=self.angle.value()
preload=self.preload.value()
### ONLY MATH HAPPENS HERE also defining X and Y ####
interpolator = InterpolatedUnivariateSpline(X, Y)
### MORE MATH HAPPENS HERE ####
self.axial.setText(str(axial))
self.radial.setText(str(radial))
def main():
app = QtGui.QApplication(sys.argv)
window=SomeCalculation()
window.show()
app.exec_()
if __name__=='__main__':
main()
Ich versuche pyinstaller file_name.py
und ich bekomme:
RuntimeError: maximum recursion depth exceeded while calling a Python object
Nun, wenn es ein paar Dinge gibt, die ich herausgefunden habe, die sich auch auf das Problem auswirken:
1) Wenn ich diese Zeile auskommentiere: from scipy.interpolate import InterpolatedUnivariateSpline
2) Erstellen einer EXE-Datei aus einem anderen Skript, das Scipy.Interpolate verwendet (RBS, aber immer noch) - funktioniert wie ein Zauber.
3) Wenn ich versuche, es mit WinPython 3.5.1.1 + pyinstaller nach EXE zu konvertieren, erhalte ich auf die gleiche Weise und es ist dieselbe 3.2-Version davon - es erzeugt meine exe-Datei ohne Probleme.
Ich möchte verstehen, was den Fehler im Originalfall verursacht, und kann auf Google leider keine Antwort finden. Die meisten Korrekturen, die ich finden konnte, bezogen sich auf matplotlib und nicht auf Interpolation.
Das hat bei mir funktioniert
Führen Sie pyinstaller aus und stoppen Sie es, um die Spezifikationsdatei zu generieren:
pyinstaller filename.py
Eine Datei mit .spec
als Erweiterung sollte generiert werden
Fügen Sie nun am Anfang der Spezifikationsdatei die folgenden Zeilen hinzu:
import sys
sys.setrecursionlimit(5000)
Führen Sie nun die Spezifikationsdatei aus:
pyinstaller filename.spec
Mustafa hat mich in die richtige Richtung geführt, Sie müssen das Rekursionslimit erhöhen. Der Code muss jedoch an den Anfang der Spezifikationsdatei und nicht in Ihren python code:
# -*- mode: python -*-
import sys
sys.setrecursionlimit(5000)
Erstellen Sie zuerst die Spezifikationsdatei mit pyi-makespec
, Bearbeiten Sie sie und erstellen Sie sie dann, indem Sie die Spezifikationsdatei an den Befehl pyinstaller
übergeben. Weitere Informationen zu nter Verwendung von Spezifikationsdateien finden Sie im pyinstaller-Handbuch.
Bitte stellen Sie sicher, dass Sie pyinstaller 3.2.0 verwenden, mit 3.2.1 erhalten Sie ImportError: cannot import name 'is_module_satisfies'
(Siehe issue auf GitHub)
ich würde versuchen, die Rekursionstiefenbegrenzung zu erhöhen. Fügen Sie am Anfang Ihrer Datei Folgendes ein:
import sys
sys.setrecursionlimit(5000)
Sie können das Rekursionslimit folgendermaßen ändern:
import sys
sys.setrecursionlimit(1000)