Вызов функций Python из C ++ - PullRequest
       8

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

18 голосов
/ 02 декабря 2010

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

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

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

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

Ответы [ 4 ]

15 голосов
/ 02 декабря 2010

Если оно может иметь любое имя:

Передать его функции, которая принимает 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()
4 голосов
/ 02 декабря 2010

Понятия не имею.Но вы можете использовать PyObject_Call() для вызова, когда у вас есть объект функции.

2 голосов
/ 02 декабря 2010

Я не использовал его раньше, но в справочном руководстве есть раздел под названием Вызов функций и методов Python , который, кажется, показывает, как это сделать.

1 голос
/ 14 июля 2011

Я использовал PyRun_SimpleString("myFunction()") как быстрый взлом, поскольку имя моей функции было известно, не принимал аргументов и жил в пространстве имен __main__. Обратите внимание, что вам также необходимо получить блокировку GIL, если вы многопоточны.

...