无法从 Python C API 中内置的模块调用方法

Can't call a method from a module built in Python C API

本文关键字:内置 模块 调用 方法 API Python      更新时间:2023-10-16

我正在尝试使用 Python C API 在 C++ 中构建一个 python 模块,这是代码:

#include "Python.h"
#include <iostream>
class MyClass {
public:
    MyClass() {};
    static MyClass& getInstance() {
        static MyClass instance;
        return instance;
    }
    void tester() {
        std::cout << "testing..." << std::endl;
    }
    static void runTesterFunc(PyObject*, PyObject*) {
        static MyClass& myObj = MyClass::getInstance();
        myObj.tester();
    }
    static PyObject* getModule() { 
        Py_SetPythonHome(L"C:\Python36");
        Py_SetProgramName(L"my_program");
        PyMethodDef pyModuleMethods[] = {
            { "runTester", (PyCFunction)runTesterFunc, METH_VARARGS | METH_KEYWORDS, "Foo Boo." },
            { NULL, NULL, 0, NULL }
        };
        static PyModuleDef MyModule = {
            PyModuleDef_HEAD_INIT,
            "my_module",
            "Foo Boo.",
            -1,
            pyModuleMethods,
            NULL
        };
        return PyModule_Create(&MyModule);
    }
    void initializePython() {
        PyImport_AppendInittab("my_module", getModule);
        Py_Initialize();
    }
};
int main() {
    static MyClass& myObj = MyClass::getInstance();
    myObj.initializePython();
    PyRun_SimpleString(
        "import my_module n"
        "my_module.runTester() n"
    );
    return 0;
}

问题是当我在PyRun_SimpleString中运行my_module.runTester()时.我收到以下错误消息:

系统错误: PyCFunction_Call中的错误呼叫标志。METH_OLDARGS不是 支持时间更长!

我没有使用METH_OLDARGS.如您所见,我正在使用METH_VARARGS | METH_KEYWORDS.我在这里可能缺少什么?

我使用的是Python 3.6和Windows 7 x64。

以下修改解决了该问题:

static PyMethodDef pyModuleMethods[] = {
    { "runTester", (PyCFunction)runTesterFunc, METH_VARARGS | METH_KEYWORDS, "Foo Boo." },
    { NULL, NULL, 0, NULL }
};
static struct PyModuleDef MyModule = {
    PyModuleDef_HEAD_INIT,
    "my_module",
    "Foo Boo.",
    -1,
    pyModuleMethods,
    NULL
};