C++ Interface

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Hallo,

ich habe ein Programm geschrieben und möchte dort Python mittels der Python C API einbinden. Da ich jedoch ein C++ Programm geschrieben habe, bin ich auf der Suche nach Design Patterns um die C API in ein C++Framework umzubauen um von dort aus Klassen für Python zu erzeugen.

Mein Grundkonzept geht dahin, dass die structs von Python (die jeweils die Informationen enthalten) im Hintergrund agieren, aber das eigentliche Wrapping dann in C++ stattfindet und die entsprechenden Python-Klassenobjekte auch tatsächlich durch C++ Klassen repräsentiert werden.

Hat da jemand eine Idee? Ich möchte übrigens keine Libraries verwenden wie SWIG oder Boost,...!


Ich danke für jeden Tipp oder Anregung. Nur als reine Information für mich: Ist die Python Integration in SWIG/Boost denn selbst noch C oder haben die genau dort ein Pattern verwendet was ich suche? Kann mir da jemand helfen?


Ich bin zu Dank verpflichtet :)


Adios,

donnerCobra
Benutzeravatar
Trundle
User
Beiträge: 591
Registriert: Dienstag 3. Juli 2007, 16:45

Und aus welchem Grund möchtest du kein Boost.Python verwenden, was jetzt meine Empfehlung gewesen wäre? Bestehende Bibliotheken in schlechter nachzubauen halte ich jetzt für keine besonders gute Idee.
"Der Dumme erwartet viel. Der Denkende sagt wenig." ("Herr Keuner" -- Bertolt Brecht)
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Ich bin damit bisher immer sehr gut gefahren. Natürlich gibt es sinnvolle Ausnahmen, aber nennen wir es eine Grundeinstellung.

Ich möchte ungerne von einer Bibliothek abhängig sein die nur als Schnittstelle dient und nicht gerade eine Hauptaufgabe hat (wie libjpeg, libpng, ...)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

DonnerCobra hat geschrieben:Hat da jemand eine Idee? Ich möchte übrigens keine Libraries verwenden wie SWIG oder Boost,...!

Ich danke für jeden Tipp oder Anregung. Nur als reine Information für mich: Ist die Python Integration in SWIG/Boost denn selbst noch C oder haben die genau dort ein Pattern verwendet was ich suche? Kann mir da jemand helfen?
Einfach im SWIG oder boost::python-Code nachschauen. Boost dürfte eher dem nahekommen, was Du möchtest (wobei ich die Frage ehrlich gesagt nicht ganz verstehe). SWIG generiert halt Wrapper, wie der Name schon sagt.

Bzgl. Boost: Boost-Python scheint nicht ganz up to date zu sein - um es vorsichtig auszudrücken. Wenn Du Dich bemüßigt fühlst ein C++-Framework zu bauen, kannst Du auch anbieten da einzusteigen. Ich bin mir sicher, Du findest Interesse. Dann hättest Du auch gleich eine Plattform zum Vertrieb Deines Codes ;-).

HTH
Christian
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Nur dem Verständnis halber: Du willst also keine C++-Funktionen haben, die in Python abrufbar sind, sondern umgekehrt auf Python-Objekte in C++ zugreifen können, richtig? Oder willst du eine C++-Klasse zu einer Python-Klasse machen?
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Ich möchte eine C++ Klasse zu einer Python Klasse machen. Das geht ja schon recht gut mit der Python C API, aber ist schon ein komischer Mix.
mit
User
Beiträge: 285
Registriert: Dienstag 16. September 2008, 10:00

Cython
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

mit hat geschrieben:Cython
... ist die Antwort auf eine hier nicht gestelte Frage.
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Also ich habe mir Boost angeschaut und ich muss schon eingestehen, dass die Einbindung von Klassen in die Python Umgebung sehr sehr einfach ist.

Code: Alles auswählen

class CppClass {
public:
    int getNum() {
    int x=3;
    return x;
  }
};


[...]

    object main_namespace = main_module.attr("__dict__");
    main_namespace["CppClass"] = class_<CppClass>("CppClass").def("getNum",&CppClass::getNum);

Hat jemand eine Ahnung nach welchem Konzept die Methode aufgelöst wird? Ich bin bisher völlig ratlos. Ich kann mir zwar die Sources anschauen, aber Boost ist auch mal nicht eben durchforstet. Mir geht es primär um die Erkennung des Rückgabewertes. In Object C heißt sowas anschenend "runtime property introspection". Aber ich finde für C++ nichts vergleichbares. Jemand eine Idee?


Danke euch.

donnerCobra
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Vielleicht ist das Kross-Framework für Dich ja interessant:
http://kross.dipe.org/

Haken dabei: Abhängigkeiten zu einigen KDE-Libs.
Antworten