Seite 1 von 1

C++-Klassen in Python verwenden

Verfasst: Montag 7. Januar 2013, 10:56
von glocke
Hi, inzwischen hab ich den Überblick der Möglichkeiten verloren.
Ich arbeite in C++ an einer kleinen 2D Game-Engine und suche nach einer Möglichkeit, diese Klassen in Python zu verwenden. Als (sinnfreies ^^) Beispiel habe ich mal eine Header- und Quellcodedatei (C++) auf Pastebin hochgeladen:

Engine.hpp: http://pastebin.com/FTC4Vv17
Engine.cpp: http://pastebin.com/J0SpBnC7

Was ich quasi "suche" ist eine Möglichkeit in Python folgendes schreiben zu können:

Code: Alles auswählen

from Engine import Engine, User

e = Engine("glocke", 12)
e.run()

u = User("hans wurst")
u.inc()
print u.finished(2)
u.foo[2] = "Hallo Welt"
print u.foo[2]
Kann mir jemand weiterhelfen?

Das größere Ziel dahinter ist es, die Engine mit Python zu verwenden.

/EDIT: Fahre ich am besten, wenn ich meine Klassen usw. mit SWIG wrappe und in Python dann die Klassen wieder "zusammenbaue"? SWIG bietet imho "nur" die Möglichkeit Klassen/Strukturen zu wrappen, wenn man alle Methoden (inkl. Konstruktoren und Destruktoren) als "Standalone-Funktionen" (siehe http://www.swig.org/Doc2.0/SWIGDocument ... ipting_nn7) wrappt (und öffentliche Felder durch Getter und Setter realisiere).

Dann könne man ja quasi um diese Funktionen in Python wieder eine Klasse drumrum bauen. Macht das Sinn (auch z.B. aus Sicht der Performance)? Laufzeitkritischere Teile (die 2D Engine soll auf meinem Netbook flüssig laufen, daher der Aufwand mit C++) lagere ich eh so weit es geht in die Engine ein. So hat sie z.B. eine Klasse, die der Darstellung der TiledMap dient und alles, was damit zu tun hat, steuert.

LG Glocke

Re: C++-Klassen in Python verwenden

Verfasst: Dienstag 8. Januar 2013, 09:51
von glocke
Hey, ich hab das bisherige Codebeispiel (http://pastebin.com/J0SpBnC7 und http://pastebin.com/FTC4Vv17) mal mit SWIG versucht in Python anzusprechen

Dazu die "Engine.i" für SWIG:

Code: Alles auswählen

%module Engine
%include "std_string.i"
%include "std_map.i"
%{ 
    #define SWIG_FILE_WITH_INIT
    #include "Engine.hpp"
%}
%include "Engine.hpp"
Gebaut habe ich mit:

Code: Alles auswählen

#!/bin/bash

clear
echo "Fetch from C++"
swig -c++ -python $1.i
echo "Compile Source"
g++ -fPIC -c $1.cpp $1_wrap.cxx -I/usr/include/python2.7/
echo "Link as Library"
g++ -shared $1_wrap.o $1.o -o _$1.so
echo "Done"
und dann "./build Engine"

Und ausgeführt (in der Python Konsole) folgendes: http://pastebin.com/03x7Xh7r
Ich schaffe es nicht, der map etwas zuzuweisen ... Was mache ich falsch?

LG Glocke

Re: C++-Klassen in Python verwenden

Verfasst: Donnerstag 28. März 2013, 18:13
von Toralf
Mittlerweile gibt es dazu auch noch ein neueres Thema, vielleicht hilt Dir das weiter: http://www.python-forum.de/viewtopic.php?f=25&t=31244

____________
Programmiersprachen-Vergleich: hier

Re: C++-Klassen in Python verwenden

Verfasst: Freitag 29. März 2013, 00:01
von Faule Socke
Der Thread ist zwar ausgegraben, aber das scheint hier ja so üblich zu sein, also antworte ich auch einfach mal: Da du die Engine sowieso aus Python heraus verwendest, hast du mal überlegt, sie direkt in Python zu schreiben und nur leistungskritische Abschnitte (z.B. blit-Algorithmen oder was auch immer du so vorhast) in C/C++ zu schreiben und mit ctypes anzusprechen? So mache ich das in der Regel...