2010-06-20 21 views
5

Me he preguntado sobre esto de vez en cuando pero nunca obtuve una respuesta definitiva. ¿Es posible en el marco de boost.python vincularse con otro módulo boost.python?Cómo vincular al módulo existente de boost python

Por ejemplo, he exportado la clase A dentro de boost_python_module (libA) y la función B (A a) dentro de boost_python_module (libB). ¿Es posible especificar en libB para vincular a A de libA.

La otra forma de ver este problema sería que ahora mismo tengo que generar todos mis enlaces de una sola vez dentro de un módulo. ¿Es posible generar enlaces de forma incremental en varios boost_python_module?

+0

Esta pregunta es muy antigua, por lo que no estoy seguro si el boost ha solucionado algo, o el OP ha pasado por alto un pequeño detalle, pero no he observado este comportamiento con la versión de impulso 1.48. Cuando compila por separado dos módulos boost :: python utilizando los mismos tipos, puede pasar una instancia creada por un módulo boost python a una función definida por otro módulo boost python. – enobayram

Respuesta

0

No sé bien la biblioteca compartida, pero lo que funciona para mí es importar todos mis módulos, que pueden hacer referencia entre sí, dentro de python: import libA; import libB.

Por supuesto, es posible colocar estas importaciones en un archivo __init__.py, de modo que si solo tiene que hacer python: import myLib.

+0

Hola, rafak, El problema ocurre porque libA y libB y envolturas para el código de C++. ¿Cómo puedo pasar un objeto create de libA a una función en libB? -Sandeep – Sandeep

+0

Si entiendo la corrección, no tengo ningún problema para hacer lo que quiera. Creo que hay algún tipo de registro global para los tipos exportados. Entonces, primero importaría libA (de lo cual depende libB porque usa clase A) y luego libB. ¿Qué error (si hay alguno) obtiene? – rafak

+0

Creo que en realidad tengo el mismo problema: tengo múltiples proyectos boost :: python diferentes que están interrelacionados. Un tipo definido en uno no parece estar disponible en el otro, en Python. Obtengo el mensaje "No to_python (by-value) converter found for C++ type" errors. Estos desaparecen si envuelvo desde el mismo módulo de extensión ... –

1

La forma de Boost.Python de manejar lo que está pidiendo es dividir su paquete en las unidades de compilación as explained in the tutorial y luego hacer una fusión en una unidad de compilación principal que realmente declara los módulos.

No puede vincular módulos independientes en Boost.Python porque declaran puntos de entrada de Python específicos que Python ejecuta cuando carga su módulo. Por ejemplo, si el nombre del módulo binario es mod.so, el intérprete de Python buscará una función llamada init_mod (que es lo que declara BOOST_PYTHON_MODULE(mod)) y ejecutará el código de esa función. Dentro del código de esa función, espera encontrar declaraciones de objetos Python C-API (instancias, clases, etc.).

Si vincula, por ejemplo, el mod.so binario a otro módulo binario (por ejemplo, foo.so), cuando las cargas de Python mod.so, lo haría única localizar y ejecutar init_mod e ignorarán init_foo.

Cuestiones relacionadas