2012-05-04 18 views
5

Actualmente estoy tratando de usar Boost Python para exportar una clase, y luego usarlo en el programa correspondiente.Boost Python: Problemas para importar un módulo

/** 
    main.cpp 
*/ 
#define BOOST_PYTHON_STATIC_LIB 
#include <Resource\ZipResourceFile.hpp> 
#include <Resource\ResourceCache.hpp> 
#include <Windows.h> 
#include <boost/python.hpp> 
#include <iostream> 

/* a simple add method, for s & g's */ 
int add(int a, int b) 
{ 
    return a + b; 
} 

/* Foo class*/ 
class Foo 
{ 
public: 
    Foo(int n); 
    ~Foo(); 
    void f(); 
}; 

/* Foo ctor, does nothingm just wanted to pass and arg */ 
Foo::Foo(int n) 
{ 

} 

/* destructor */ 
Foo::~Foo() 
{ 
} 

/* f() implementation, calls Foo!!! to cout */ 
void Foo::f() 
{ 
    std::cout << "Foo!!!" << '\n'; 
} 

/* Boost python module definition */ 
BOOST_PYTHON_MODULE(PyBackend) 
{ 
    using namespace boost::python; 

    def("add", add); 
    class_<Foo>("Foo", init<int>()) 
     .def("f", &Foo::f); 
} 



int main(int argc, char* argv[]) 
{ 
    PyImport_AppendInittab("PyBackend", init_PyBackend); 
    Py_Initialize(); 
    PyRun_SimpleString("import PyBackend"); 
    PyRun_SimpleString("foo = PyBackend.Foo(1)"); 

    Py_Finalize(); 

    { 
     int n; 
     std::cin >> n; 
    } 
    return 0; 
} 

De todos modos, no tengo ni idea de donde puedo encontrar el init_PyBackend función, a pesar de que parece lo más lógico que yo llamaría si no lo estaba usando Boost.Python.

El módulo en sí no está en una DLL separada, se compila todo al mismo tiempo. De todos modos, ¿alguien tiene alguna idea sobre lo que puedo hacer?

+0

En el futuro, coloque cualquier código relevante/errores en línea en lugar de vincularlo a un sitio externo. – ildjarn

+0

¡Oh bien, gracias amigo! Traté de resaltarlo todo luego ctrl-k, pero no lo formateó bien. ¿Cómo conseguiste todo muy bien formateado? – DubyaDubyaDubyaDot

+0

Ctrl + K es el enfoque correcto, pero si eso no funciona, siempre hay el icono '{}' en la barra de herramientas. : -] Habiendo dicho eso, no tengo claro cuál es tu pregunta: ¿por qué te importa 'init_PyBackend'? ¿Qué problema real estás teniendo? – ildjarn

Respuesta

10

La convención para nombrar a la función de inicialización del módulo es:

  • init*** para Python 2.x (no subrayado).
  • PyInit_*** para Python 3.x.

Boost.Python's BOOST_PYTHON_MODULE macro cumple estas convenciones.

Dado que está utilizando Python 3.2, por lo tanto, se llamará a la función de inicialización del módulo PyBackend:

PyInit_PyBackend.

Tenga en cuenta que para los módulos con nombres que comienzan con un guión, como _sre, las funciones init son init_sre/PyInit__sre (aviso de dos guiones para Python 3.x).

Cuestiones relacionadas