web-dev-qa-db-fra.com

pyinstaller créant EXE RuntimeError: profondeur de récursivité maximale dépassée lors de l'appel d'un objet Python

J'utilise WinPython 3.4.4.3 avec pyinstaller 3.2 (obtenu via pip install pyinstaller).

Maintenant, j'ai un code Qt4 vraiment simple que je veux convertir en EXE et j'ai rencontré un problème que je ne peux pas résoudre.

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

J'essaye d'exécuter pyinstaller file_name.py et je reçois:

RuntimeError: maximum recursion depth exceeded while calling a Python object

Maintenant, s'il y a quelques choses que j'ai découvertes qui affectent également le problème:

1) Si je commente cette ligne: from scipy.interpolate import InterpolatedUnivariateSpline

2) La création d'un fichier EXE à partir d'un autre script différent qui utilise Scipy.Interpolate (RBS, mais quand même) - fonctionne comme un charme.

3) Si j'essaie de le convertir en EXE en utilisant WinPython 3.5.1.1 + pyinstaller obtenu de la même manière, et c'est la même version 3.2 - il ne génère aucun problème avec mon fichier exe.

Je veux comprendre ce qui cause l'erreur dans le cas d'origine et je ne trouve malheureusement aucune réponse sur google, la plupart des correctifs que j'ai pu trouver étaient liés à matplotlib et non à une interpolation.

18
H_Four

Cela a fonctionné pour moi

  1. Exécutez pyinstaller et arrêtez-le pour générer le fichier de spécifications:

    pyinstaller filename.py
    

    Un fichier avec .spec comme extension doit être générée

  2. Ajoutez maintenant les lignes suivantes au début du fichier de spécifications:

    import sys
    sys.setrecursionlimit(5000)
    
  3. Exécutez maintenant le fichier de spécification en utilisant:

    pyinstaller filename.spec
    
26
Aviral

Mustafa m'a guidé dans la bonne direction, il faut augmenter la limite de récursivité. Mais le code doit être placé au début du fichier de spécifications et non dans votre code python:

# -*- mode: python -*-
import sys
sys.setrecursionlimit(5000)

Créez le fichier de spécifications avec pyi-makespec d'abord, modifiez-le puis compilez en passant le fichier de spécifications à la commande pyinstaller. Voir le manuel pyinstaller pour plus d'informations sur en utilisant des fichiers spec .

Veuillez vous assurer d'utiliser pyinstaller 3.2.0, avec 3.2.1 vous obtiendrez ImportError: cannot import name 'is_module_satisfies' (voir le issue sur GitHub)

26
urxter

j'essaierais d'augmenter la limite de profondeur de récursivité. Insérez au début de votre dossier:

import sys
sys.setrecursionlimit(5000)
5
Mustafa Gondalwala

Vous pouvez modifier la limite de récursivité de la manière suivante:

import sys
sys.setrecursionlimit(1000)
0
user11855545