cython;pyside2;RecursionError: maximum recursion depth exceeded while calling a Python object

cython;pyside2;RecursionError: maximum recursion depth exceeded while calling a Python object

以下非常简单的代码运行良好:python tmpmain.py 会给你一个 window 和一个帮助菜单,Help->About 会给你一条消息。但是一旦我将 tmp.py cython 化为扩展,并将 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

与答案相比,这更像是一个不令人满意的解决方法:

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

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

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

我不清楚为什么这会有所帮助,但我发布了解决方法的答案,并希望这能为某人提供从何处开始正确诊断故障的线索。