在cpp中嵌入python:如何获得python函数(而不是PyObject)的Cpointer?

2024-10-01 00:32:27 发布

您现在位置:Python中文网/ 问答频道 /正文

<>我希望能够为现有C++应用程序编写用户Python插件。主应用程序将使用boost::signals2发出触发用户python代码执行的信号。我设置了一个工作示例,在其中调用users python模块中的initialize方法。用户可以订阅调用“connect”方法的信号:

import ctypes
CALLBACK_VOID_FUNC = CFUNCTYPE(None)

def myVoidHandler():
    print("myVoidHandler (python)")

def initialize(myCHandle):
    global myCDll, callback1
    myCDll = ctypes.CDLL("CppEventsd",  handle = myCHandle)
    [...]
    callback1 = CALLBACK_VOID_FUNC(myVoidHandler)
    myCDll.connect(b"readyToGo", callback1)
    [...]

连接方法的签名:

extern "C" __declspec(dllexport) bool connect(char* signalName, void(*pF)())

现在可以从cpp调用python函数myVoidHandler,如下所示:

pF();

但更重要的是,pF可以连接到升压信号。你知道吗

但是,我想让用户不用再经历这个过程(并且让我自己也不用再处理支持请求,因为他们没有完全正确地得到它),因此我想通过使用函数/插槽的命名约定从cpp端连接python函数。 我可以很容易地检索到python回调的PyObjet指针:

PyObject *pModule, *pDict, *pVoidHandlerF;
pModule = PyImport_Import(pName);
pDict = PyModule_GetDict(pModule);
pVoidHandlerF = PyDict_GetItemString(pDict, "myVoidHandler");

但是我不知道如何从cpp端获取实际的函数指针(相当于pF)!python到Cpp的转换过程中似乎正在进行一些转换。你知道吗

有什么想法吗?你知道吗


Tags: 方法函数用户应用程序信号connectctypescpp
1条回答
网友
1楼 · 发布于 2024-10-01 00:32:27
< >而不是直接连接到Python函数指针,您可以创建自己的C++函数,使用Python C-API调用Python函数。举个例子:

boost::signals2::signal<void(void)>& sig = [...];
PyObject* pVoidHandlerF = [...];
sig.connect([=]() {
    PyObject_CallObject(pVoidHandlerF, NULL);
});

这允许你在C++方面做其他的事情,例如传递参数、返回值、检查错误等等。

相关问题 更多 >