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())
我不清楚为什么这会有所帮助,但我发布了解决方法的答案,并希望这能为某人提供从何处开始正确诊断故障的线索。
以下非常简单的代码运行良好: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())
我不清楚为什么这会有所帮助,但我发布了解决方法的答案,并希望这能为某人提供从何处开始正确诊断故障的线索。