pyinstaller创建EXE RuntimeError:调用Python对象时超出了最大递归深度

H_F*_*our 18 python recursion exe pyinstaller scipy

我正在使用pyinstaller 3.2(通过pip install pyinstaller获得)运行WinPython 3.4.4.3.

现在我有一些非常简单的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()
Run Code Online (Sandbox Code Playgroud)

我试着跑pyinstaller file_name.py,我得到:

RuntimeError: maximum recursion depth exceeded while calling a Python object
Run Code Online (Sandbox Code Playgroud)

现在,如果我发现的一些事情也影响了这个问题:

1)如果我注释掉这一行: from scipy.interpolate import InterpolatedUnivariateSpline

2)从另一个使用Scipy.Interpolate的不同脚本创建EXE文件(RBS,但仍然) - 就像一个魅力.

3)如果我尝试使用WinPython将其转换为EXE 3.5.1.1 + pyinstaller以相同的方式获得,并且它是相同的3.2版本 - 它生成我的exe文件没有问题.

我想了解导致原始案例中的错误的原因并且我在谷歌上找不到任何答案,我发现的大多数修复都与matplotlib有关而不是插值.

小智 29

这对我有用

  1. 运行pyinstaller并将其停止以生成spec文件:

    pyinstaller filename.py
    
    Run Code Online (Sandbox Code Playgroud)

    .spec应生成具有扩展名的文件

  2. 现在将以下行添加到spec文件的开头:

    import sys
    sys.setrecursionlimit(5000)
    
    Run Code Online (Sandbox Code Playgroud)
  3. 现在使用以下命令运行spec文件:

    pyinstaller filename.spec
    
    Run Code Online (Sandbox Code Playgroud)

  • 想知道为什么pyinstaller的创建者不将递归限制作为命令行选项。或至少可以在FAQ中的某个地方提及该问题。 (2认同)

urx*_*ter 27

Mustafa确实指引我走向正确的方向,你必须增加递归限制.但是代码必须放在spec文件的开头而不是你的python代码中:

# -*- mode: python -*-
import sys
sys.setrecursionlimit(5000)
Run Code Online (Sandbox Code Playgroud)

首先创建spec文件pyi-makespec,编辑它然后通过将spec文件传递给pyinstaller命令来构建.有关使用spec文件的更多信息,请参阅pyinstaller手册.

请确保使用pyinstaller 3.2.0,3.2.1即可获得ImportError: cannot import name 'is_module_satisfies'(请参阅GitHub上的问题)


Jae*_*Kim 6

直到 2020 年 3 月,这个问题仍未得到解决。根据某些人的解释,我增加了 .spec 文件中的 setrecursionlimit 并尝试构建它,但它不起作用。

通过谷歌搜索,我发现这个问题是由最新版本的openpyxl和pyinstaller冲突引起的。老版本的openpyxl,比如2.3.5版本,不会导致这个问题。

因此,此问题的解决方案如下。

pip uninstall openpyxl
pip install openpyxl==2.3.5
Run Code Online (Sandbox Code Playgroud)


小智 5

我会尝试增加递归深度限制。在文件开头插入:

import sys
sys.setrecursionlimit(5000)
Run Code Online (Sandbox Code Playgroud)

  • 做过某事。没有帮助。 (3认同)