2010-12-02 7 views
18

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

Say есть функция, определенная в Python:

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

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

ответ

15

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

передать его в функцию, которая принимает 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

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

+2

Если у вас есть `boost :: python :: object`, вы можете просто использовать его` operator() `для его вызова. – eudoxos 2011-07-14 08:19:25

2

Я не использовал его раньше, но в справочном руководстве есть раздел, называемый Calling Python Functions and Methods, который, как представляется, показывает, как это сделать.

+1

Документация Boost python в значительной степени устарела и очень плохая, даже если она обновлена. – 2010-12-02 16:57:06

+0

А я хорошо пробовал. :-) – Ken 2010-12-02 18:11:14

1

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