cython; pyside2; RecursionError:调用Python对象时超出了最大递归深度

时间:2019-09-02 00:14:44

标签: python cython pyside2

以下非常简单的代码运行良好:python tmpmain.py将为您提供一个带有帮助菜单的窗口,而Help-> About将为您提供一条消息。但是一旦我将tmp.py cythonize到扩展名,并将tmp.py重命名为tmp.py.bak以确保tmpmain.py调用了已编译的扩展名,python tmpmain.py将导致RecursionError:调用时超出了最大递归深度一个Python对象。我已尽可能地简化了代码,希望它可以帮助调试。有什么建议吗?

#tmpmain.py
from tmp import main
if __name__ == '__main__':
    main() 

#tmp.py
from PySide2.QtWidgets import (QApplication,  QMainWindow, QMenu, QMessageBox)
 from PySide2.QtCore import Slot

class MainWindow(QMainWindow):

    def __init__(self, parent=None):
        super().__init__()
        self.setupHelpMenu()        


    def setupHelpMenu(self):
        helpMenu = QMenu("&Help", self)
        self.menuBar().addMenu(helpMenu)
        helpMenu.addAction("&About", self.about)

    @Slot()
    def about(self):
        QMessageBox.about(self, "About", "This is a demo")

import sys

def main():

    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

编译tmp.py的命令是:

cythonize -X language_level=3 -i tmp.py

1 个答案:

答案 0 :(得分:0)

这不是一个令人满意的解决方法,而不是答案:

实际上我以前和posted the same unsatisfactory workaround as a comment都遇到过这个问题。您需要通过更改以下行将函数调用包装在lambda函数中:

helpMenu.addAction("&About", self.about)

helpMenu.addAction("&About", lambda: self.about())

目前尚不清楚这究竟有何帮助,但我正在发布答案,以便针对变通办法,并希望这为某人提供了一个从哪里开始对故障进行正确诊断的线索。