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
这对我有用
运行pyinstaller并将其停止以生成spec文件:
pyinstaller filename.py
Run Code Online (Sandbox Code Playgroud)
.spec应生成具有扩展名的文件
现在将以下行添加到spec文件的开头:
import sys
sys.setrecursionlimit(5000)
Run Code Online (Sandbox Code Playgroud)现在使用以下命令运行spec文件:
pyinstaller filename.spec
Run Code Online (Sandbox Code Playgroud)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上的问题)
直到 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)