使用 Cython 运行已编译的 pyd 文件时,出现“takes exactly 1 positional argument (2 given)”错误 [duplicate]

When running a compiled pyd file with Cython, a "takes exactly 1 positional argument (2 given)" error occurs [duplicate]

提问人:mahaha3211 提问时间:11/15/2023 最后编辑:mahaha3211 更新时间:11/15/2023 访问量:53

问:

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout

class ExampleApp(QWidget):
    def __init__(self):
        super().__init__()

        # UI 초기화
        self.init_ui()

    def init_ui(self):
        # 버튼 생성
        self.btn = QPushButton('click', self)
        self.btn.clicked.connect(self.on_button_click)

        # 레이아웃 생성
        layout = QVBoxLayout()
        layout.addWidget(self.btn)

        # 윈도우에 레이아웃 설정
        self.setLayout(layout)

        # 윈도우 설정
        self.setGeometry(300, 300, 300, 200)
        self.setWindowTitle('pyqt5 example')
        self.show()

    def on_button_click(self):
        print('clicked.')


app = QApplication(sys.argv)
ex = ExampleApp()
sys.exit(app.exec_())`

test.py

from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext
from Cython.Build import cythonize

ext_modules = [
    Extension("test", ["test.pyx"]),
]

setup(
    name='test',
    ext_modules=cythonize(ext_modules, compiler_directives={'language_level': "3"}),
    zip_safe=False
)

编译 setup.py

__import__("test")

main.py

上面的代码是我写的一个例子。使用 Cython 将此代码写入 pyd 和 C 文件后,我遇到了一个 TypeError:on_button_click() 在尝试运行 pyd 文件时正好接受 1 个位置参数(给定 2 个)。我已经尽一切努力寻找原因,但无法弄清楚。有谁知道原因?我正在使用 Windows 10 64 位、Python 3.8.10 和 Visual Studio Community 2022。

我尝试将 Visual Studio 2019 用于不同的 MSVC 版本,但它仍然不起作用。我还试图降级 Cython,怀疑这可能是问题所在,但这也不起作用。虽然我没有使用更高版本的 Python 进行测试,但我使用的是 Python 3.8.10,因为它需要在 Windows 7 上运行。

python pyqt5 cython cythonize

评论

0赞 Michael Butscher 11/15/2023
根据文档,您应该接受一个参数。on_button_clickchecked
0赞 mahaha3211 11/15/2023
@MichaelButscher可能不是。因为当您运行源代码而不使用 Cython 编译它时(我的意思是作为 .py 文件运行),问题不会出现。
1赞 musicamante 11/15/2023
@mahaha3211 这是因为 PyQt 在内部模仿了 Qt 的行为,它能够调用一个参数少于信号签名的函数/插槽,并且它只是通过基本的 try/except 循环来做到这一点,而 Cython 似乎并非如此。添加参数,或使用槽装饰器。

答: 暂无答案