pyinstaller creating EXE RuntimeError: maximum recursion depth exceeded while calling a Python object

问题描述 投票:0回答:10

我正在运行带有 pyinstaller 3.2 的 WinPython 3.4.4.3(通过 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)从另一个使用 Scipy.Interpolate(RBS,但仍然)的不同脚本创建 EXE 文件 - 就像一个魅力。

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

我想了解是什么导致了原始案例中的错误,不幸的是我在谷歌上找不到任何答案,我能找到的大多数修复都与 matplotlib 有关,而不是插值。

python recursion scipy exe pyinstaller
10个回答
83
投票

这对我有用

  1. 运行 pyinstaller 并停止它以生成规范文件:

    pyinstaller filename.py
    

    应生成以

    .spec
    为扩展名的文件

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

    import sys
    sys.setrecursionlimit(5000)
    
  3. 现在运行规范文件使用:

    pyinstaller filename.spec
    

33
投票

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

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

首先使用

pyi-makespec
创建spec文件,编辑它,然后通过将spec文件传递给
pyinstaller
命令来构建。有关 using spec files.

的更多信息,请参阅 pyinstaller 手册

请确保使用 pyinstaller 3.2.0,使用 3.2.1 你会得到

ImportError: cannot import name 'is_module_satisfies'
(参见 GitHub 上的issue


6
投票

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

import sys
sys.setrecursionlimit(5000)

6
投票

直到2020年3月,这个问题还没有解决。根据某些人的解释,我在 .spec 文件中增加了 setrecursionlimit 并尝试构建它,但它没有用。

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

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

pip uninstall openpyxl
pip install openpyxl==2.3.5

4
投票

有时候连5000的上限都不够。它帮助我将限制设置为 20000。(在文件“filename.spec”中)

import sys
sys.setrecursionlimit(20000)

1
投票

使用 pipenv 创建新环境并只安装需求包。 (您环境中未使用的包会导致 .exe 文件的大小增加并导致此错误发生) 我尝试使用 python 3.8 并且它有效


0
投票

您可以通过以下方式更改递归限制:

import sys
sys.setrecursionlimit(1000)

0
投票

我遇到了同样的问题。我尝试了这里建议的大部分内容。但是,我无法在笔记本电脑上解决问题。对我有用的总结如下:

  1. 打开 Anaconda 提示符。
  2. 使用 conda activate my_env 激活您的环境。
  3. 使用 cd your_folder_directory 从 Anaconda 命令提示符导航到您的项目文件夹。
  4. 运行 pyinstaller --onefile my_python_file.py

这不应该产生任何递归错误。 这将在您的项目目录中创建一个 dist 文件夹。您的可执行文件将出现在该文件夹中。


0
投票

安装 pyinstaller 最后一个开发者版本:

pip uninstall pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip

0
投票

将你的 pyinstaller 降级到 5.6.2

首先卸载你当前的pyinstaller

pip uninstall pyinstaller

安装pyinstaller 5.6.2版本

pip install pyinstaller==5.6.2

这对我有用。 在我尝试运行 .exe 时,最新版本一直给我“最大递归深度超出错误”

© www.soinside.com 2019 - 2024. All rights reserved.