Estoy ejecutando WinPython 3.4.4.3 con pyinstaller 3.2 (obtenido a través de pip install pyinstaller).
Ahora tengo un código Qt4 realmente simple que quiero convertir a EXE y tengo un problema que no puedo resolver.
El código:
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()
Intento ejecutar pyinstaller file_name.py
y pyinstaller file_name.py
:
RuntimeError: maximum recursion depth exceeded while calling a Python object
Ahora si hay algunas cosas que he descubierto que también afectan el problema:
1) Si comento esta línea: from scipy.interpolate import InterpolatedUnivariateSpline
2) La creación de un archivo EXE desde otro script diferente que usa Scipy.Interpolate (RBS, pero aún así) – funciona como un encanto.
3) Si trato de convertirlo a EXE usando WinPython 3.5.1.1 + pyinstaller obtenido de la misma manera, y es la misma versión 3.2, no genera problemas con mi archivo exe.
Quiero entender qué está causando el error en el caso original y desafortunadamente no puedo encontrar ninguna respuesta en google, aunque la mayoría de las soluciones que pude encontrar estaban relacionadas con matplotlib y no con interpolación.
Mustafa me guió en la dirección correcta, tienes que boost el límite de recursión. Pero el código debe ponerse al principio del archivo de especificaciones y no en su código de python:
# -*- mode: python -*- import sys sys.setrecursionlimit(5000)
pyi-makespec
el archivo de especificaciones con pyi-makespec
, pyi-makespec
y luego compile pasando el archivo de especificaciones al comando pyinstaller
. Consulte el manual de pyinstaller para obtener más información sobre el uso de archivos de especificaciones .
Por favor, asegúrese de usar pyinstaller 3.2.0, con 3.2.1 obtendrá ImportError: cannot import name 'is_module_satisfies'
(vea el problema en GitHub)
Esto funciono para mi
Ejecute pyinstaller y deténgalo para generar el archivo de especificaciones:
pyinstaller filename.py
Debe generarse un archivo con .spec
como extensión
Ahora agregue las siguientes líneas al principio del archivo de especificaciones:
import sys sys.setrecursionlimit(5000)
Ahora ejecuta el archivo de especificaciones usando:
pyinstaller filename.spec
Intentaría boost el límite de profundidad de recursión. Inserte al comienzo de su archivo:
import sys sys.setrecursionlimit(5000)