我想为现有的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的转换似乎正在进行一些转换。
有什么想法吗?
答案 0 :(得分:0)
您可以创建自己的C ++函数来使用python C-API来调用python函数,而不必直接连接到python函数指针。这是一个示例:
boost::signals2::signal<void(void)>& sig = [...];
PyObject* pVoidHandlerF = [...];
sig.connect([=]() {
PyObject_CallObject(pVoidHandlerF, NULL);
});
这允许您在C ++方面做其他事情,例如,传递参数,返回值,检查错误等。