pyinstaller создает EXE RuntimeError: максимальная глубина рекурсии превышена при вызове объекта Python

Я запускаю WinPython 3.4.4.3 с pyinstaller 3.2 (полученный с помощью pip install pyinstaller).

Теперь у меня есть очень простой код Qt4, который я хочу преобразовать в EXE, и у меня возникла проблема, которую я не могу решить.

Код:

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

Я пытаюсь запустить pyinstaller file_name.py и я получаю:

RuntimeError: maximum recursion depth exceeded while calling a Python object

Теперь, если есть несколько вещей, которые я обнаружил, которые также влияют на проблему:

1) Если я прокомментирую эту строку: from scipy.interpolate import InterpolatedUnivariateSpline

2) Создание EXE файла из другого сценария, использующего Scipy.Interpolate(RBS, но все же) - работает как шарм.

3) Если я попытаюсь преобразовать его в EXE, используя WinPython 3.5.1.1 + pyinstaller, полученный таким же образом, и он будет тем же самым 3.2-версией - он генерирует мой exe файл без проблем.

Я хочу понять, что вызывает ошибку в исходном случае, и я не могу найти ответ на Google, к сожалению, большинство исправлений, которые я смог найти, были связаны с matplotlib, а не с интерполяцией.

Ответы

Ответ 1

Мустафа вел меня в правильном направлении, вам нужно увеличить предел рекурсии. Но код должен быть помещен в начало файла spec, а не в ваш код на Python:

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

pyi-makespec создайте спецификационный файл с помощью pyi-makespec, отредактируйте его, а затем создайте, передав файл spec команде pyinstaller. Дополнительную информацию об использовании файлов спецификаций см. В руководстве pyinstaller.

Обязательно используйте pyinstaller 3.2.0, с 3.2.1 вы получите ImportError: cannot import name 'is_module_satisfies' (см. Вопрос о GitHub)

Ответ 2

Это сработало для меня

  1. Запустите pyinstaller и остановите его для создания спецификационного файла:

    pyinstaller filename.py
    

    Должен быть создан файл с расширением .spec

  2. Теперь добавьте следующие строки в начало файла спецификации:

    import sys
    sys.setrecursionlimit(5000)
    
  3. Теперь запустите файл spec, используя:

    pyinstaller filename.spec
    

Ответ 3

я попытаюсь увеличить лимит глубины рекурсии. Вставьте в начало файла:

import sys
sys.setrecursionlimit(5000)

Ответ 4

Это не поможет мне ни изменить версию Python, ни увеличить предел рекурсии. Помощь приветствуется.

Ответ 5

Вы можете внести изменения в предел рекурсии следующим образом:

import sys
sys.setrecursionlimit(1000)