Создайте PyObject * из функции C?
Я внедряю Python в библиотеку С++, которую я создаю. Я бы хотел, чтобы пользователи могли передавать функции C в виде указателей на функции PyObject* (fpFunc*)(PyObject*,PyObject*);
, чтобы я мог использовать эти функции во встроенном Python.
Итак, у меня есть указатель на функцию, и я знаю, что эту функцию можно использовать как метод модуля с помощью структуры PyMethodDef
и передать ее в Py_InitModule("module", ModMethods);
и, таким образом, получить PyObject* module
, который я могу легко захватить функциями из.
Но я бы очень хотел, чтобы вы могли создавать эту функцию "на лету", не задумываясь при этом каждый раз обновлять другой модуль.
Я просмотрел документы Python и некоторые заголовки Python, чтобы подумать о хакерском способе делать это без реального успеха... но мне интересно, есть ли более обычный способ сделать это.
Из того, что я понял, каждая функция принадлежит модулю, даже __builtin__
, поэтому, я думаю, мне понадобится хотя бы модуль.
Любая идея о том, как достичь этого?
Ответы
Ответ 1
Нашел. Хотя это не в документах, и это вряд ли явно в источнике.
PyObject* (*fpFunc)(PyObject*,PyObject*) = someFunction;
PyMethodDef methd = {"methd",fpFunc,METH_VARARGS,"A new function"};
PyObject* name = PyString_FromString(methd.ml_name);
PyObject* pyfoo = PyCFunction_NewEx(&methd,NULL,name);
Py_DECREF(name);
Это работает. Я могу вызвать функцию, как обычно я бы назвал объект функции Python.
Если вам интересно, все, что я нашел в документе, было около Py_InitModule4
и загрузки модулей, поэтому я пошел проверять источник Python и узнал о PyCFunction
, затем я просмотрел документ, но я не мог 't найти что-нибудь о PyCFunction_NewEx
, поэтому мне пришлось проверить источник, чтобы убедиться, что это было так, как я думал.