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

时间:2016-08-16 14:44:00

标签: python recursion scipy exe pyinstaller

我使用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的不同脚本创建EXE文件(RBS,但仍然) - 就像魅力一样。

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

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

9 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:17)

这对我有用

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

    /questions/8

    应生成扩展名为pyinstaller filename.py 的文件

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

    .spec
  3. 现在使用以下命令运行规范文件:

    import sys
    sys.setrecursionlimit(5000)
    

答案 2 :(得分:6)

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

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

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

pip uninstall openpyxl
pip install openpyxl==2.3.5

答案 3 :(得分:4)

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

import sys
sys.setrecursionlimit(5000)

答案 4 :(得分:2)

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

proba<-read_excel("my_data.xlsx")
attach(proba)

Y<-cbind(GDP_growth)
X<-cbind(gfdddi01, gfdddi02, gfdddi04, gfdddi05)
pdata<-pdata.frame(proba,index=c("id","year"))
##POOLED OLS estimator
pooling<-plm(Y~X,data=pdata,model="pooling")
summary(pooling)

##BETWEEN ESTIMATOR
between<-plm(Y~X,data=pdata,model="between")
summary(between)

#FIRST DIFFERENCES ESTIMATOR
firstdiff<-plm(Y~X,data=pdata,model="fd")
summary(firstdiff)

#FIXED EFFECT OR WITHIN ESTIMATOR
fixed <-plm(Y~X,data=pdata,model="within")
summary(fixed)

#RANDOM EFFECTS ESTIMATOR
random<- plm(Y~X,data=pdata,model="random")
summary(random)

答案 5 :(得分:0)

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

import sys
sys.setrecursionlimit(1000)

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我面临着同样的问题。我尝试了这里建议的大多数事情。但是,我无法解决笔记本电脑上的问题。总结如下:

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

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

答案 8 :(得分:0)

install pyinstaller上一个开发人员版本:

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