Hallo Leute!
Ich habe eine C++ Library die ich gerne (teilweise) wrappen würde um die Funktionalität in Python nutzen zu können. Ich bin mir nicht ganz sicher wie das sinnvollste Vorgehen dabei ist. Die Library (PolyVox: siehe http://www.thermite3d.org wenns interessiert) ist relativ umfangreich (28 Header-files) und da ich nicht alle Funktionen benötige möchte ich gerne nur einen Teil davon wrappen. Mein erster Gedanke war, mir eine C++ Klasse zu bauen, die Methoden hat die auf die gewünschten Funktionen zugreift und mir so eine vereinfachte Schnittstelle zu PolyVox bietet. Anschliessend wollte ich diese Proxyklasse wrappen. Zum wrappen habe ich SWIG und boost.python ausprobiert, bin aber mittlerweile bei PyBindGen(http://code.google.com/p/pybindgen/) gelandet.
Folgendes habe ich nun also:
- Headerfile der Proxyklasse
- cpp File der Proxyklasse
- cpp wrapper File (Python/C API Code)
Was ist jetzt das korrekte Vorgehen um diese 3 files in eine .pyd zu überführen? Momentan habe ich das Problem, dass beim Erstellungsprozess anscheinend die komplette PolyVox Library mit erstellt wird...dabei möchte ich doch eigentlich nur ne .pyd haben die auf ein paar Funktionen der polyvox.dll zugreifen kann.
Mich beschleicht das Gefühl, dass ich da irgendwas grundlegendes nicht verstanden habe, ist das überhaupt möglich was ich vor habe?
Ich sag schonmal Danke
Gruß,
Sebastian
Grundlgende Frage zum wrappen von C++
Wenn Du keine vollständige, sondern lediglich eine möglichst einfache, Deinen Zwecken genügende Anbindung möchtest, dann empfehle ich die Verwendung von cython.
Hi lunar,
danke für die schnelle Antwort Ich werde mich gleich mal mit Cython befassen. Ist denn der Weg den ich beschrieben habe prinzipiell machbar? Ich hab da ja nun schon 'ne Menge Zeit reingesteckt und würde einfach gerne wissen was ich falsch mache
Gruß,
Sebastian
danke für die schnelle Antwort Ich werde mich gleich mal mit Cython befassen. Ist denn der Weg den ich beschrieben habe prinzipiell machbar? Ich hab da ja nun schon 'ne Menge Zeit reingesteckt und würde einfach gerne wissen was ich falsch mache
Gruß,
Sebastian
Hallo nochmal
Ich habe mich jetzt ein wenig mit cython beschäftigt, hänge aber an einer Typendefinition fest.
hier der cython code:
Zum bauen benutze ich distutils, welches mir folgendes ausgibt:
und so sehen die typedefs in der Header-Datei aus:
Was mache ich falsch?
Gruß, Sebastian
Ich habe mich jetzt ein wenig mit cython beschäftigt, hänge aber an einer Typendefinition fest.
hier der cython code:
Code: Alles auswählen
from libcpp.vector cimport vector
from libcpp cimport bool
# Wrapper for the Vector Class #
cdef extern from "Vector.h" namespace "PolyVox":
# Vector<int Size, Type>
cdef cppclass Vector[int, TYPE]:
Vector()
Vector(TYPE, TYPE)
Vector(TYPE, TYPE, TYPE)
Vector(TYPE, TYPE, TYPE, TYPE)
##operators here##
TYPE getElement(int)
TYPE getX()
TYPE getY()
TYPE getZ()
TYPE getW()
setElement(int, TYPE)
setElements(TYPE, TYPE)
setElements(TYPE, TYPE, TYPE)
setElements(TYPE, TYPE, TYPE, TYPE)
setX(TYPE)
setY(TYPE)
setZ(TYPE)
setW(TYPE)
double length()
double lengthSquared()
double angleTo(Vector[int, TYPE]&)
Vector[int, TYPE] cross(Vector[int, TYPE]&)
TYPE dot(Vector[int, TYPE]&)
normalise()
ctypedef Vector[3, float] Vector3DFloat
ctypedef Vector[3, double] Vector3DDouble
ctypedef Vector[3, int] Vector3DInt8
ctypedef Vector[3, int] Vector3DUint8
ctypedef Vector[3, int] Vector3DInt16
ctypedef Vector[3, int] Vector3DUint16
ctypedef Vector[3, int] Vector3DInt32
ctypedef Vector[3, int] Vector3DUint32
Code: Alles auswählen
Error converting Pyrex file to C:
------------------------------------------------------------
...
double angleTo(Vector[int, TYPE]&)
Vector[int, TYPE] cross(Vector[int, TYPE]&)
TYPE dot(Vector[int, TYPE]&)
normalise()
ctypedef Vector[3, float] Vector3DFloat
^
------------------------------------------------------------
C:\Users\Basti\Thesis\Freeme3D\cython_wrap\polyvox.pyx:34:30: Syntax error in ct
ypedef statement
building 'PolyVox' extension
error: unknown file type '.h' (from 'Vector.h')
Code: Alles auswählen
//Some handy typedefs
///A 3D Vector of floats.
typedef Vector<3,float> Vector3DFloat;
///A 3D Vector of doubles.
typedef Vector<3,double> Vector3DDouble;
///A 3D Vector of signed 8-bit values.
typedef Vector<3,int8_t> Vector3DInt8;
///A 3D Vector of unsigned 8-bit values.
typedef Vector<3,uint8_t> Vector3DUint8;
///A 3D Vector of signed 16-bit values.
typedef Vector<3,int16_t> Vector3DInt16;
///A 3D Vector of unsigned 16-bit values.
typedef Vector<3,uint16_t> Vector3DUint16;
///A 3D Vector of signed 32-bit values.
typedef Vector<3,int32_t> Vector3DInt32;
///A 3D Vector of unsigned 32-bit values.
typedef Vector<3,uint32_t> Vector3DUint32;
Gruß, Sebastian
Ich bin an der Stelle immer noch nicht weiter, habe die typedefs erstmal auskommentiert und nun lässt es sich auch kompilieren. jetzt hab ich allerdings nen Problem den Wrappercode mit der PolyVox Bibliohek zusammen zu bringen... aber dafür gibt es andere Orte die ich konsultieren sollte Keine Idee warum ich bei den typedefs Fehler bekomme?
Gruß, Sebastian
Gruß, Sebastian
so ich bin ein wenig schlauer. Cython unterstützt (noch) keine non-type parameter templates. Als Workaround wurden mir "cname specifiers" und "c shims" genannt. Darüber habe ich allerdings wenig bis garnichts gefunden, kennt einer von euch nen Beispiel für cname oder c shims?
Gruß,
Sebastian
Gruß,
Sebastian