我正在运行带有 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 有关,而不是插值。
这对我有用
运行 pyinstaller 并停止它以生成规范文件:
pyinstaller filename.py
应生成以
.spec
为扩展名的文件现在将以下行添加到规范文件的开头:
import sys
sys.setrecursionlimit(5000)
现在运行规范文件使用:
pyinstaller filename.spec
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)
我会尝试增加递归深度限制。在文件开头插入:
import sys
sys.setrecursionlimit(5000)
直到2020年3月,这个问题还没有解决。根据某些人的解释,我在 .spec 文件中增加了 setrecursionlimit 并尝试构建它,但它没有用。
通过谷歌搜索,我发现这个问题是由于最新版本的openpyxl和pyinstaller冲突引起的。旧版本的 openpyxl,如 2.3.5 版本,不会导致此问题。
因此,针对此问题的解决方案如下。
pip uninstall openpyxl
pip install openpyxl==2.3.5
有时候连5000的上限都不够。它帮助我将限制设置为 20000。(在文件“filename.spec”中)
import sys
sys.setrecursionlimit(20000)
使用 pipenv 创建新环境并只安装需求包。 (您环境中未使用的包会导致 .exe 文件的大小增加并导致此错误发生) 我尝试使用 python 3.8 并且它有效
您可以通过以下方式更改递归限制:
import sys
sys.setrecursionlimit(1000)
我遇到了同样的问题。我尝试了这里建议的大部分内容。但是,我无法在笔记本电脑上解决问题。对我有用的总结如下:
这不应该产生任何递归错误。 这将在您的项目目录中创建一个 dist 文件夹。您的可执行文件将出现在该文件夹中。
安装 pyinstaller 最后一个开发者版本:
pip uninstall pyinstaller
pip install https://github.com/pyinstaller/pyinstaller/archive/develop.zip
将你的 pyinstaller 降级到 5.6.2
首先卸载你当前的pyinstaller
pip uninstall pyinstaller
安装pyinstaller 5.6.2版本
pip install pyinstaller==5.6.2
这对我有用。 在我尝试运行 .exe 时,最新版本一直给我“最大递归深度超出错误”