在kivy最大递归深度超出,但仅在包装,使用Python开发应用程序时不

问题描述 投票:0回答:2

我想收拾这需要几个进口,这些matplotlib.pyplot中的应用

该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的作品完美的蟒蛇。

然而,当我尝试收拾它作为一个独立的应用程序kivy它给了我最大的错误递归深度超出。

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

1.有在应用程序没有递归函数。

2.Works完全在蟒蛇的Spyder在开发它,测试它,唯一的问题是包装过程中。

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.setrecursionlimit(高数)的递归限制,但它不是一个解决这个问题。我真的失去了。任何见解表示赞赏。

谢谢

编辑2019年2月4日:有人提出这个问题:pyinstaller creating EXE RuntimeError: maximum recursion depth exceeded while calling a Python object是重复的,并回答了这个问题。蟒蛇-m PyInstaller --name touchtracer例子路径\演示\ touchtracer \ main.py:虽然这是明确一个相关的问题是有益的,在创建kivy包的第一阶段发生我的错误

python kivy pyinstaller
2个回答
1
投票

当我们进入一个递归,存在栈溢出和CPython的引擎盖没有承担起自己优化尾递归下工作的风险,因此,如果你去太深,你会走向一个堆栈溢出接近。一般来说不同的CPython / Python的口味有不同的递归许可证的深度,你在本地运行有更自由的深度限制(通常是因为假设开发商有足够好的电脑,这可能发生)的Python版本。但是,当你使用工具打包应用程序,它们通常覆盖sys.setrecursionlimit更为保守的价值,因为他们试图确保你不会造成系统的堆栈溢出用较低的硬件。

可悲的是,没有银弹对于这个问题,你可以尝试寻找到特定经理和改变限制(不推荐),或者你可以尝试你的递归块转换成迭代块。


1
投票

谢谢你这么多大家谁试图帮助。我找到了答案,我希望它可以帮助谁试图创建一个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

这会给你maximum recursion depth exceeded或任何错误的错误这个原本提供给您。别担心。这个步骤的目的是创建一个初始spec文件。

2.打开spec文件,并添加所有的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除此之外,在添加的规范文件中的以下的开头:

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

4.Also中,您可能需要隐藏的进口增加任何进口。

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

5.Just跟随在最后一步

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

那是:

python -m PyInstaller touchtracer.spec

并得到您的应用程序内置

© www.soinside.com 2019 - 2024. All rights reserved.