2011-03-23 18 views
6

Recientemente descubrí la existencia de boost-python y quedé asombrado por su aparente simplicidad. Quería probarlo y comencé a envolver una biblioteca de C++ existente.Cómo envolver una función init/cleanup en Boost python

Mientras envolver las llamadas básicas de la API de la biblioteca es bastante simple (nada especial, simplemente llamadas a funciones regulares y parámetros muy comunes), no sé cómo envolver adecuadamente las funciones de inicialización/limpieza:

Tal como está , mi biblioteca C++ requiere que la persona que llama primero llame al mylib::initialize() cuando se inicia el programa, y ​​para llamar al mylib::cleanup() antes de que termine (en realidad también hay un objeto inicializador que se ocupa de eso, pero probablemente sea irrelevante).

¿Cómo debo envolver esto usando boost python?

Forzar a un usuario de Python para llamar mymodule.initialize() y mymodule.cleanup() no parece muy Pythonic. ¿Hay alguna forma de hacerlo de forma automática? Idealmente, la llamada a initialize() se realizaría de forma transparente cuando se importe el módulo y la llamada a cleanup() también se realizará cuando finalice el script de python.

¿Hay alguna manera de hacerlo? Si no, ¿cuál es la solución más elegante?

Gracias.

Respuesta

9

Puede tratar de hacer un objeto de guardia y asignarlo a un atributo oculto de su módulo.

struct MyLibGuard 
{ 
    MyLibGuard() { myLib::initialize();} 
    ~MyLibGuard() { myLib::cleanup();} 
}; 

using namespace boost::python; 

BOOST_PYTHON_MODULE(arch_lib) 
{ 
    boost::shared_ptr<MyLibGuard> libGuard = new MyLibGuard(); 

    class_<MyLibGuard, boost::shared_ptr<MyLibGuard>, boost::noncopyable>("MyLibGuard", no_init); 
    scope().attr("__libguard") = libGuard; 

} 
+0

Veo que esta es la mejor manera de hacerlo. A menudo, con boost :: python si necesitas una funcionalidad especializada, simplemente creas una estructura simple como se hizo anteriormente. –

+0

Gracias por su respuesta. Lo intentaré y lo mantendré informado :) – ereOn

+0

Tuve que reemplazar 'class__' con' class_' para poder compilar. Y tuvo que cambiar() las últimas 2 líneas para que Python no se queje. Muchas gracias. ¿Te importa si edito tu respuesta para reflejar los cambios? – ereOn

Cuestiones relacionadas