提问者:小点点

在kivy中超过了最大递归深度,但仅在打包时,而不是在python中开发应用程序时


我正在尝试打包一个需要多个导入的应用程序,其中包括matplotlib. py图

kivy应用程序(简化,但仍在工作)是:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
import matplotlib.pyplot


Builder.load_string("""
<MyWidget>:
    id: my_widget
    FileChooserIconView:
        id: filechooser
        on_selection: my_widget.selected(filechooser.selection)
    Image:
        id: image
        source: ""
""")


class MyWidget(BoxLayout):

    def selected(self,filename):
        self.ids.image.source = filename[0]


class MyApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    MyApp().run()

这个应用程序在使用spyder的python中完美运行。

但是,当我尝试将其打包为独立的kivy应用程序时,它会给我错误超过最大递归深度。

我很惊讶,我不知道问题是什么,因为:

1.应用中没有递归函数。

在python spyder中完美2.Works,同时开发和测试它,唯一的问题是在打包过程中。

3.我尝试了多个选项,包括注释掉几个部分,最令人惊讶的是,当我注释掉导入matplotlib. pyplot时,应用程序包很好。然而,我需要matplotlib.pyplot这个应用程序,所以把它拿出来不是一个选项。

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.lang import Builder
#import matplotlib.pyplot


Builder.load_string("""
<MyWidget>:
    id: my_widget
    FileChooserIconView:
        id: filechooser
        on_selection: my_widget.selected(filechooser.selection)
    Image:
        id: image
        source: ""
""")


class MyWidget(BoxLayout):

    def selected(self,filename):
        self.ids.image.source = filename[0]


class MyApp(App):
    def build(self):
        return MyWidget()


if __name__ == '__main__':
    MyApp().run()

上面的代码可以很好地工作和打包。

是不是有一些限制的文件的大小可以导入到kivy应用程序?我已经尝试增加递归限制与sys. setpostsionlimited(高数字)但它不是这个问题的解决方案。我真的迷失了。任何洞察力赞赏。

谢谢你们

编辑2019年2月4日:有人建议问题: pyinstall er创建EXE RuntimeError:调用Python对象时超过的最大递归深度是重复的,并回答了这个问题。虽然这绝对是一个相关的问题并且很有帮助,但我的错误发生在kivy包创建的第一阶段:python-m PyInstaller--name触摸跟踪器示例-路径\demo\触摸跟踪器\main.py


共2个答案

匿名用户

非常感谢所有试图提供帮助的人。我找到了一个答案,我希望它能帮助其他尝试创建kivy包的人,并且在导入python模块时遇到问题。

一旦您准备好打包您的main.py脚本:

1.从以下说明开始

https://kivy.org/doc/stable/guide/packaging-windows.html

并做第一步:

python -m PyInstaller --name touchtracer examples-path\demo\touchtracer\main.py

这将为您提供超过最大递归深度的错误或它最初给您带来的任何错误。不用担心。此步骤的目的是创建一个初始spec文件。

2.Openspec文件并添加kivy指令提供的所有附加内容

https://kivy.org/doc/stable/guide/packaging-windows.html

那就是:

from kivy.deps import sdl2, glew
Tree('examples-path\\demo\\touchtracer\\'),
*[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],

3.In,在spec文件的开头添加以下内容:

import sys
sys.setrecursionlimit(5000) # (or some big number)

4.还要在您可能需要的隐藏导入中添加任何导入。

hiddenimports=[] # change to (example importing pandas and matplotlib) hiddenimports=['pandas', 'matplotlib']

5.按照最后一步在

https://kivy.org/doc/stable/guide/packaging-windows.html

那就是:

python -m PyInstaller touchtracer.spec

并构建您的应用程序

匿名用户

当我们进入递归时,存在堆栈溢出的风险,并且在幕后工作的Cpython不会自行优化尾部递归,因此如果您走得太深,您将更接近堆栈溢出。通常不同的Cpython/python风格具有不同的递归允许深度,您在本地运行的python版本具有更宽松的深度限制(通常是因为假设开发人员有足够好的计算机可以发生这种情况)。但是当您使用工具来打包应用程序时,它们通常会将sys. setpostsionlimited覆盖为更保守的值,因为它们试图确保您不会在硬件较低的系统上导致堆栈溢出。

遗憾的是,这个问题没有灵丹妙药,您可以尝试查看您的特定管理器并更改限制(不推荐),或者您可以尝试将递归块转换为迭代块。