Подтвердить что ты не робот

Вызов функций Python из С++

Я пытаюсь выполнить функции вызова Python из С++. Я думал, что это может быть достигнуто с помощью указателей функций, но это кажется невозможным. Я использовал boost.python, чтобы выполнить это.

Скажем, что существует функция, определенная в Python:

def callback(arg1, arg2):
    #do something
    return something

Теперь мне нужно передать эту функцию на С++, чтобы ее можно было вызвать оттуда. Как написать код на стороне С++ с помощью boost.python для этого?

4b9b3361

Ответ 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, если вы многопоточны.