在 cpp 中嵌入 python:如何获取指向 python 函数(而不是 PyObject)的 C 指针?
Embedding python in cpp: How to get a C-pointer to a python function (not to a PyObject)?
我想为现有的 C++ 应用程序启用用户 python-插件的编写。主应用程序将使用 boost::signals2 发出信号,触发用户 python 代码的执行。我设置了一个工作示例,其中调用了用户 python 模块中的初始化方法。用户可以订阅信号调用 "connect"-method:
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 函数functions/slots 的命名约定。
我可以轻松检索指向 python 回调的 PyObjet 指针:
PyObject *pModule, *pDict, *pVoidHandlerF;
pModule = PyImport_Import(pName);
pDict = PyModule_GetDict(pModule);
pVoidHandlerF = PyDict_GetItemString(pDict, "myVoidHandler");
但是我不知道如何从 cpp 端获取实际的函数指针(相当于 pF)! python 到 Cpp 的过渡似乎正在发生一些转变。
有什么想法吗?
您可以创建自己的 C++ 函数,使用 python C-API 调用 python 函数,而不是直接连接到 python 函数指针.这是一个例子:
boost::signals2::signal<void(void)>& sig = [...];
PyObject* pVoidHandlerF = [...];
sig.connect([=]() {
PyObject_CallObject(pVoidHandlerF, NULL);
});
这允许您在 C++ 端执行其他操作,例如传递参数、返回值、检查错误等。
我想为现有的 C++ 应用程序启用用户 python-插件的编写。主应用程序将使用 boost::signals2 发出信号,触发用户 python 代码的执行。我设置了一个工作示例,其中调用了用户 python 模块中的初始化方法。用户可以订阅信号调用 "connect"-method:
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 函数functions/slots 的命名约定。 我可以轻松检索指向 python 回调的 PyObjet 指针:
PyObject *pModule, *pDict, *pVoidHandlerF;
pModule = PyImport_Import(pName);
pDict = PyModule_GetDict(pModule);
pVoidHandlerF = PyDict_GetItemString(pDict, "myVoidHandler");
但是我不知道如何从 cpp 端获取实际的函数指针(相当于 pF)! python 到 Cpp 的过渡似乎正在发生一些转变。
有什么想法吗?
您可以创建自己的 C++ 函数,使用 python C-API 调用 python 函数,而不是直接连接到 python 函数指针.这是一个例子:
boost::signals2::signal<void(void)>& sig = [...];
PyObject* pVoidHandlerF = [...];
sig.connect([=]() {
PyObject_CallObject(pVoidHandlerF, NULL);
});
这允许您在 C++ 端执行其他操作,例如传递参数、返回值、检查错误等。