Создайте 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, поэтому мне пришлось проверить источник, чтобы убедиться, что это было так, как я думал.