Вызов функций Python из С++
Я пытаюсь выполнить функции вызова Python из С++. Я думал, что это может быть достигнуто с помощью указателей функций, но это кажется невозможным. Я использовал boost.python
, чтобы выполнить это.
Скажем, что существует функция, определенная в Python:
def callback(arg1, arg2):
#do something
return something
Теперь мне нужно передать эту функцию на С++, чтобы ее можно было вызвать оттуда. Как написать код на стороне С++ с помощью boost.python
для этого?
Ответы
Ответ 1
Если у него может быть любое имя:
Передайте его функции, которая принимает boost::python::object
.
bp::object pycb; //global variable. could also store it in a map, etc
void register_callback(bp::object cb)
{
pycb = cb;
}
Если он находится в одном известном пространстве имен с постоянным именем:
bp::object pycb = bp::scope("namespace").attr("callback");
bp::object
имеет operator()
определенный, поэтому вы вызываете его точно так же, как любая функция
ret = pycb()
Ответ 2
Не подсказка. Но вы можете использовать PyObject_Call()
, чтобы вызвать его, когда у вас есть объект функции.
Ответ 3
Я не использовал его раньше, но в справочном руководстве есть раздел Вызов функций и методов Python, который, как представляется, показывает, как это сделать это.
Ответ 4
Я использовал PyRun_SimpleString("myFunction()")
как быстрый хак, поскольку имя моей функции было известно, не принимало никаких аргументов и не проживало в пространстве имен __main__
. Обратите внимание, что вам также необходимо получить блокировку GIL, если вы многопоточны.