2012-05-04 15 views
5

Ich versuche derzeit, Boost Python zu verwenden, um eine Klasse zu exportieren, und verwenden Sie sie dann in dem entsprechenden Programm.Boost Python: Probleme beim Importieren eines Moduls

/** 
    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; 
} 

Wie auch immer, ich habe keine Ahnung, wo ich die Funktion init_PyBackend finden kann, auch wenn das die logische Sache scheint, ich nennen würde, wenn ich nicht Boost.Python verwendet wurde.

Das Modul selbst ist nicht in einer separaten DLL, es ist alle zur gleichen Zeit kompiliert. Wie auch immer, hat jemand irgendwelche Ideen, was ich tun kann?

+0

In Zukunft sollten Sie alle relevanten Codes/Fehler inline einfügen und nicht auf eine externe Site verlinken. – ildjarn

+0

Oh okay, danke Kumpel! Ich habe versucht, alles zu markieren, dann ctrl-k, aber es hat es nicht richtig formatiert. Wie hast du alles schön formatiert? – DubyaDubyaDubyaDot

+0

Strg + K ist der richtige Ansatz, aber wenn das nicht funktioniert, gibt es immer das '{}' Symbol in der Symbolleiste. : -] Davon abgesehen ist es mir nicht klar, was deine Frage ist - warum kümmerst du dich um 'init_PyBackend'? Welches aktuelle Problem hast du? – ildjarn

Antwort

10

Konvention zum Modul Initialisierungsfunktion Benennung ist:

  • init*** für Python 2.x (kein Unterstrich).
  • PyInit_*** für Python 3.x.

Boost.Python BOOST_PYTHON_MODULE Makro folgt diesen Konventionen.

Da Sie mit Python 3.2, die Initialisierung-Funktion Ihres PyBackend Modul wird deshalb aufgerufen werden:

PyInit_PyBackend.

beachte, daß für Module mit Namen, die mit einem Unterstreichungsstart, wie _sre, die init Funktionen init_sre/PyInit__sre (Anmerkung zwei Unterstreichungen für Python 3.x) sind.

Verwandte Themen