2010-12-02 32 views
18

Estoy tratando de lograr llamar a las funciones de Python desde C++. Pensé que se podía lograr a través de punteros de función, pero no parece posible. He estado usando boost.python para lograr esto.Llamando a las funciones de Python desde C++

decir que hay una función definida en Python:

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

ahora tengo que pasar esta función para C++, por lo que se puede llamar desde allí. ¿Cómo escribo el código en el lado de C++ usando boost.python para lograr esto?

Respuesta

15

Si pudiera tener cualquier nombre:

pasarlo a una función que toma un boost::python::object.

bp::object pycb; //global variable. could also store it in a map, etc 
void register_callback(bp::object cb) 
{ 
     pycb = cb; 
} 

Si es en un único espacio de nombres conocidos con un nombre consistente:

bp::object pycb = bp::scope("namespace").attr("callback"); 

bp::object ha operator() definido, por lo que se llame igual que cualquier función

ret = pycb() 
+0

Thnks Matthew, Tengo una pregunta adicional. Aquí se llama al objeto python desde el mismo hilo. ¿Y si el objeto de Python fuera global y se llamara desde un hilo diferente? – Amar

+0

Eso es posible, aunque algo más allá del alcance de esta pregunta. Recomiendo investigar la familia de funciones PyGILState_ * de la API C/Python. A diferencia de Boost-Python, Python tiene muy buenos documentos. Si aún necesita más ayuda, haga otra pregunta. –

+2

Para futuros televidentes: Alguien eventualmente hizo esa otra pregunta, y yo la contesté. Mire aquí: stackoverflow.com/questions/8009613/boost-python-not-supporting-parallelism/8011153#8011153 –

4

Ni una pista. Pero puede usar PyObject_Call() para llamarlo una vez que tenga el objeto de función.

+2

Si tiene un 'boost :: python :: object', puede usar su' operator() 'para llamarlo. – eudoxos

2

No lo he usado antes, pero el manual de referencia tiene una sección llamada Calling Python Functions and Methods que parece mostrar cómo hacerlo.

+1

La documentación de Boost python está en gran parte desactualizada y es extremadamente mala incluso cuando está actualizada. –

+0

Ah, bueno, lo intenté. :-) – Ken

+0

Esa página no muestra una función de Python. Simplemente le muestra cómo llamar a uno con un objeto ya encuadernado. No es exactamente un "simple ejemplo". – CashCow

1

Solía ​​PyRun_SimpleString("myFunction()") como hack rápido, como el nombre de mi función era conocido, no tomó argumentos y vivió en el espacio de nombres __main__. Tenga en cuenta que también necesita obtener GIL de bloqueo si tiene múltiples subprocesos.

Cuestiones relacionadas