使用Cython

时间:2017-10-06 08:56:49

标签: python linux

我有一个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没有使我的应用程序在内存上优化:/

谢谢:)

2 个答案:

答案 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

将魔术代码应用于信号所连接的每个功能。