webentwicklung-frage-antwort-db.com.de

pyinstaller, das EXE RuntimeError erstellt: Die maximale Rekursionstiefe wurde beim Aufrufen eines Python - Objekts überschritten

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.

18
H_Four

Das hat bei mir funktioniert

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

  2. Fügen Sie nun am Anfang der Spezifikationsdatei die folgenden Zeilen hinzu:

    import sys
    sys.setrecursionlimit(5000)
    
  3. Führen Sie nun die Spezifikationsdatei aus:

    pyinstaller filename.spec
    
26
Aviral

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)

26
urxter

ich würde versuchen, die Rekursionstiefenbegrenzung zu erhöhen. Fügen Sie am Anfang Ihrer Datei Folgendes ein:

import sys
sys.setrecursionlimit(5000)
5

Sie können das Rekursionslimit folgendermaßen ändern:

import sys
sys.setrecursionlimit(1000)
0
user11855545