Как вызвать функцию C++ из Python?

Это вопрос о встраивании скриптового языка в C++. С Lua и JavaScript я разобрался легко, а вот как вызывать функции написанные в C++ из Python так и не смог понять. Помогите пожалуйста, вот код на lua и JavaScript. Как такое можно сделать через CPython?

#include "duktape.h"

static duk_ret_t test(duk_context *ctx)
{
    printf("test");
    return 0;
}

int main()
{
    duk_context*ctx=duk_create_heap_default();
    duk_push_c_function(ctx,test,DUK_VARARGS);
    duk_put_global_string(ctx, "test");
    duk_eval_string(ctx,"test();");

    return 0;
}
#include "lua.hpp"

int test(lua_State*l)
{
    printf("test");
    return 0;
}

int main()
{
    lua_State*l=luaL_newstate();
    lua_register(l,"test",test);
    luaL_dostring(l,"test()");

    return 0;
}

Ответы (1 шт):

Автор решения: Chorkov

Если вам нужен минимальный пример embediing-python, с декларацией функций из c++ в python, именно через интерфейс низкого уровня, то вот:

static PyObject * test(PyObject *, PyObject *)
{
    printf("test");
    return  Py_None ; // 
}
static PyMethodDef declare_test[] = {
    {"test", (PyCFunction)test, METH_NOARGS, PyDoc_STR("print 'test'.")},
    {NULL, NULL}
};

int main(int argc, char *argv[])
{
    
    wchar_t *program = Py_DecodeLocale(argv[0], NULL);
    Py_SetProgramName(program);
    Py_Initialize();
    
    PyObject * mainModule = PyImport_ImportModule("__main__");
    PyObject * mainModule_dict = PyObject_GetAttrString( mainModule, "__dict__"  );
    
    PyModule_AddFunctions( mainModule, declare_test );

    PyRun_SimpleString( "test()\n");
    
    Py_DECREF(mainModule_dict);
    Py_DECREF(mainModule);

    Py_FinalizeEx();
    PyMem_RawFree(program);
    return 0;
}

Однако, если нужно проэкспортировать больше пары функций, и из С++ (а не С), то рекомендую, вместо CPython воспользоваться обертками интерфейса более высокого уровня. Например, boost.python.

→ Ссылка