C++-Klassen in Python verwenden

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

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
glocke
User
Beiträge: 66
Registriert: Mittwoch 23. Februar 2011, 21:18

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
Toralf
User
Beiträge: 1
Registriert: Mittwoch 27. März 2013, 16:26

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
Zuletzt geändert von Toralf am Montag 13. Mai 2013, 22:09, insgesamt 1-mal geändert.
Faule Socke
User
Beiträge: 11
Registriert: Mittwoch 27. März 2013, 10:57

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...
Antworten