C++ Klasse in Python via Boost

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
veloxid
User
Beiträge: 1
Registriert: Mittwoch 28. März 2012, 07:41

Hallo zusammen,

Zusammen mit einem Bekannten wollen wir gerne ein Python program schreiben, welches eine C/C++-Klasse nutzt.
Die Ueberlegung war boost:python zu nutzen.
Wir haben unsere C++-Klasse dementstprechend erweitert, wobei die Klasse jumoSubClientHandler von der Klasse subClientHandler erbt.

Code: Alles auswählen

class 	jumoSubClientHandler: public subClientHandler{
	//todo constructor
public:
	jumoSubClientHandler(std::string clientName="jumoClient");
private:
	jumoInterface jumo;
public:
	void printHelp();
private:
	int extractProgramNumber(std::string data);
public:
	bool analyseData(packetData_t data);
};
die Erweiterung um die Klasse in Python zu nutzen sieht wie folgt aus:

Code: Alles auswählen

using namespace boost::python;

// Boost.python definitions to expose classes to Python
BOOST_PYTHON_MODULE(jumoSubClientHandler) {
	//	class_<subClientHandler>("subClientHandler",init<std::string>())
	//			;
    class_<jumoSubClientHandler> ("jumoSubClientHandler",init<std::string>())
    		.def("printHelp", &jumoSubClientHandler::printHelp())
    ;
    // Line below is necessary to expose the vector "nodes" to Python
    // and have it function as expected in Python

}
Zurzwit haben wir "nur " die Funktion printHelp und den Constructor verknuepft um es zu testen.
Leider scheint das aus irgendeinem Grund nicht zu funktionieren....
Das kompilen klappt und ich erzeuge die passende *.so Datei.
Wenn ich jedoch in Python import machen will klappt das nicht:

Code: Alles auswählen

>>> import jumoSubClientHandler
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initjumoSubClientHandler)
>>>  
Das lesen des Tutorials auf der boost HP hat mich bisher nicht weiter gebracht.
Hat jemand eine erklaerung dafuer?
Viele Gruesse
Felix
lunar

@veloxid: Wie ich Dir schon im ArchLinux-Forum gesagt habe, ist der exakte Aufruf des Linkers und des Compilers hier von Bedeutung, da Du möglicherweise vergessen hast, gegen alle benötigten Bibliotheken zu linken. Zudem ist es wichtig, dass Boost.Python gegen diejenige Python-Versionen gebunden ist, in welcher Du das Modul importierst.

Und auch noch mal die Frage, ob Boost.Python obligatorisch ist? Andere Generatoren und Tools wie SIP oder cython sind meines Erachtens einfacher zu nutzen.

Es gilt im Übrigen für höflich, Fragen, die in mehreren Foren gestellt werden, aufeinander zu verlinken. Hätte ich gewusst, dass DU auch hier fragst, so hätte ich mir die Antwort im Arch-Forum wohl gespart.

EDIT: Btw, Zeichenketten übergibt man in C++ üblicherweise als konstante Referenz (e.g. "const string&"). Es ist auch nicht nötig, Zugriffsmodifizierer vor jede Deklaration zu schreiben. Es reicht vielmehr ein Block pro Zugriffsmodifizierer.
scoder
User
Beiträge: 13
Registriert: Freitag 4. Februar 2011, 19:04

Du kannst dir auch mal Cython ansehen. Ist einfacher zu verwenden als BoostPython (weil Python und kein C++), und zudem noch schneller.
Antworten