繁体   English   中英

将python嵌入cpp中:如何获取C指针指向python函数(而不是PyObject)?

[英]Embedding python in cpp: How to get a C-pointer to a python function (not to a PyObject)?

我想为现有的C ++应用程序启用用户python-plugins的编写。 主应用程序将使用boost :: signals2发出触发用户python代码执行的信号。 我设置了一个工作示例,其中在用户python模块中调用了initialize方法。 用户可以订阅信号来调用“连接”方法:

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)
    [...]

connect方法的签名:

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的转换似乎正在进行一些转换。

有任何想法吗?

除了直接连接到python函数指针,您还可以创建自己的C ++函数,该函数使用python C-API来调用python函数。 这是一个例子:

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

这使您可以在C ++方面做其他事情,例如,传递参数,返回值,检查错误等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM