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

Posted

技术标签:

【中文标题】pyinstaller 创建 EXE RuntimeError:调用 Python 对象时超出最大递归深度【英文标题】:pyinstaller creating EXE RuntimeError: maximum recursion depth exceeded while calling a Python object 【发布时间】:2016-12-23 00:10:46 【问题描述】:

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

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

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

【问题讨论】:

你解决过这个问题吗? 【参考方案1】:

这对我有用

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

    pyinstaller filename.py
    

    应该生成一个以.spec为扩展名的文件

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

    import sys
    sys.setrecursionlimit(5000)
    

    现在运行规范文件:

    pyinstaller filename.spec
    

【讨论】:

想知道为什么 pyinstaller 的创建者不将递归限制作为命令行选项。或者至少在常见问题解答中的某处提及问题。 谢谢。除了这个,互联网上没有任何东西对我有用! 对我来说,它有效,但无法使用 EXE 文件。它会运行,但之后会关闭。 @Pedram 打开一个终端并从那里运行它 我突然收到这个错误。而且我总是使用规范文件。【参考方案2】:

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

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

首先使用pyi-makespec 创建规范文件,对其进行编辑,然后通过将规范文件传递给pyinstaller 命令进行构建。有关using spec files 的更多信息,请参阅 pyinstaller 手册。

请确保使用 pyinstaller 3.2.0,使用 3.2.1 您将获得 ImportError: cannot import name 'is_module_satisfies'(请参阅 GitHub 上的 issue)

【讨论】:

【参考方案3】:

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

import sys
sys.setrecursionlimit(5000)

【讨论】:

做到了。没用。 这似乎对我有帮助,知道为什么吗?你有指针吗? 当我尝试从包含模块的包外部运行脚本时,它会出错,但如果我在包内调用脚本它会成功。有什么想法吗?【参考方案4】:

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

通过google,我发现这个问题是由最新版本的openpyxl和pyinstaller冲突引起的。老版本的openpyxl,比如2.3.5版本,不会出现这个问题。

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

pip uninstall openpyxl
pip install openpyxl==2.3.5

【讨论】:

【参考方案5】:

有时甚至限制 5000 是不够的。它帮助我将限制设置为 20000。(在文件 'filename.spec' 中)

import sys
sys.setrecursionlimit(20000)

【讨论】:

【参考方案6】:

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

import sys
sys.setrecursionlimit(1000)

【讨论】:

【参考方案7】:

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

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

【参考方案9】:

安装 pyinstaller 上一个开发者版本:

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

【讨论】:

以上是关于pyinstaller 创建 EXE RuntimeError:调用 Python 对象时超出最大递归深度的主要内容,如果未能解决你的问题,请参考以下文章

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

有没有办法创建从 pyinstaller --onefile 生成的单个可执行 exe 文件的 MSI 包?

ImportError: 当使用pyinstaller创建一个.exe时,无法导入名称'pywrap_tensorflow'。

使用带有 mayavi 导入的 pyinstaller 创建独立的 exe

使用 PyInstaller 创建的 .exe 文件不显示其 GUI

Pyinstaller - 独立的 .exe