【问题标题】:cython;pyside2;RecursionError: maximum recursion depth exceeded while calling a Python objectcython;pyside2;RecursionError: 调用 Python 对象时超出最大递归深度
【发布时间】:2020-01-05 02:24:10
【问题描述】:

以下非常简单的代码运行良好:python tmpmain.py 会给你一个带有帮助菜单的窗口,而 Help->About 会给你一个消息。但是,一旦我将 tmp.py 转换为扩展名,并将 tmp.py 重命名为 tmp.py.bak 以确保 tmpmain.py 调用已编译的扩展名,python tmpmain.py 将导致 RecursionError: maximum recursion depth exceeded while calling a 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

【问题讨论】:

  • 在带有 Python 3.7.4 的 Linux (Arch Linux) 中,Cython 0.29.13 和 PySide2 5.13 可以正常工作。即使是简化的代码也会给您带来同样的问题吗?
  • 我在Windows 10上:Python 3.7.3,Cython 0.29.13,PySide2 5.12.4,编译器是:Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.22。 27905,我可以正确编译和运行非PySide2测试用例。
  • 尝试将 PySide2 版本更新到 5.13
  • Miniconda 3只有5.12.4,让我看看我能做什么。谢谢!
  • 我pip安装了pyside2 5.13,python代码依旧可以运行,但是编译后的版本还是有递归错误。

标签: python cython pyside2


【解决方案1】:

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

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

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

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

我不清楚这究竟有什么帮助,但我发布了解决方法的答案,并希望这给某人一个线索,从哪里开始正确诊断故障。

【讨论】:

  • 建议的方法有效。虽然我期待一个正式的方式,但我们需要继续保持下去。感谢您的神奇建议!
  • 检查了这个方法,我在尝试使用 Cython 编译一个包含 PySide2 窗口和 Maya 2022 (Python 3) 小部件的模块时遇到了同样的问题。在我的情况下,partial 解决了它,我遇到了.connect() 函数的问题。
猜你喜欢
  • 1970-01-01
  • 2017-11-07
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 2020-07-13
相关资源
最近更新 更多