我使用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有关,而不是插值。
答案 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)
这对我有用
运行pyinstaller并停止它以生成规格文件:
/questions/8
应生成扩展名为pyinstaller filename.py
的文件
现在将以下几行添加到spec文件的开头:
.spec
现在使用以下命令运行规范文件:
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)
我面临着同样的问题。我尝试了这里建议的大多数事情。但是,我无法解决笔记本电脑上的问题。总结如下:
这不应创建任何递归错误。 这将在您的项目目录中创建一个dist文件夹。您的可执行文件将显示在此文件夹中。
答案 8 :(得分:0)
install pyinstaller上一个开发人员版本:
pip uninstall pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip