我有一个python应用程序,它在python上完美运行但在运行cythonized脚本时出错。
当我使用cython编译脚本时,一切都编译好了,我在Linux上使用Raspberry编译并运行它。
setup.py
from distutils.core import setup
from Cython.Build import cythonize
setup(ext_modules=cythonize(["*.py"]),)
然后我运行setup.sh进行编译,然后删除所有已编译的* .py,*。c和* .pyc,以确保正在运行的是已编译的* .so文件。我编译除了mainGUI.py之外的所有内容,它都是基于PySide的,并且在编译时总是会中断。
setup.sh
sudo python3 ./setup.py build_ext --inplace
find . -name \*.py -delete
find . -name \*.c -delete
sudo rm -r ./__pycache__
sudo rm -r ./build
然后我运行我的应用
sudo python3 mainGUI.py
一切似乎都没问题,GUI出现了,菜单正常工作,但是当我读到终端时,我多次得到这个输出:
RecursionError: maximum recursion depth exceeded while calling a Python object
但我不知道script.py会抛出这个。我已经尝试将一些scripts.py从编译中删除,并让它们以.py(例如mySQLdatabaseScript.py)运行,并且减少了RecursionError的数量,但没有消除。
所以即使我的GUI运行,并且似乎没有错误,我的大多数函数都无法正常工作,它们会抛出RecursionError。
我已经读过我可以增加递归限制
sys.setrecursionlimit(1500)
但我应该在哪里这样做?在mainGUI.py?或者在每个script.py上?
我在这个过程中可以看到的一件事是cython没有使我的应用程序在内存上优化:/
谢谢:)
答案 0 :(得分:0)
我有同样的错误。完全相同的。 我注意到只有当我使用pyside“信号连接”功能时才会发生这种情况。 例如,使用计时器显示时钟。
timer = QtCore.QTimer(self)
timer.timeout.connect(self.showTime) #will fail in every showTime Call
timer.start(1000)
我决定不使用计时器。好。它现在有效。 连接双击时出现相同的错误。这不好。 连接单选按钮时出现相同的错误。
更新:解决方案,我转到PyQt5,并计划支付许可证。 Cythonized脚本可以正常使用信号槽功能。
答案 1 :(得分:0)
我知道这个问题已经很老了,但是对于其他会遇到此问题的人,我找到了一种解决方案,可以节省500美元的许可证费用...:)
from PySide2.QtWidgets import QWidget
class MyWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self._timer = QTimer()
# This is the Magic Code!!!
setattr(self, "MyWidget._on_timeout", self._on_timeout)
self._timer.timeout.connect(self._on_timeout)
def _on_timeout(self):
# Do your timer
pass
将魔术代码应用于信号所连接的每个功能。