Создать PyObject * из функции C? - PullRequest
11 голосов
/ 08 июля 2011

Я встраиваю Python в библиотеку C ++, которую я создаю.Я хотел бы, чтобы пользователи могли передавать функции C в виде указателей на функции PyObject* (fpFunc*)(PyObject*,PyObject*);, чтобы я мог использовать эти функции во встроенном Python.

Итак, у меня есть указатель на функцию, и я знаю, что этоможно поместить эту функцию как метод модуля, используя структуру PyMethodDef и передав ее в Py_InitModule("module", ModMethods); и, таким образом, получить PyObject* module, из которого я могу легко получить функции.

Но, что бы я действительно оценилчтобы иметь возможность создавать эту функцию на лету, без необходимости каждый раз заново создавать другой модуль.

Я изучил документы Python и некоторые заголовки Python, чтобы подумать о хакерском способе сделать это без реальногоуспех ... но мне интересно, есть ли более обычный способ сделать это.

Из того, что я понял, каждая функция принадлежит модулю, даже __builtin__, так что я предполагаю, что мне потребуется по крайней мерена модуле.

Есть идеи, как этого добиться?

1 Ответ

23 голосов
/ 08 июля 2011

Нашел это. Хотя это не в документации и вряд ли в явном виде в источнике.

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

...