Grundlgende Frage zum wrappen von C++

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Loschi
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2010, 17:41

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
lunar

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.
Loschi
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2010, 17:41

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
Loschi
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2010, 17:41

Hallo nochmal :)

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
Zum bauen benutze ich distutils, welches mir folgendes ausgibt:

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')
und so sehen die typedefs in der Header-Datei aus:

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;
Was mache ich falsch? :)

Gruß, Sebastian
lunar

Welche cython-Version ist das?
Loschi
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2010, 17:41

das ist die neuste 0.13 :)
Loschi
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2010, 17:41

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
Loschi
User
Beiträge: 6
Registriert: Mittwoch 27. Oktober 2010, 17:41

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
Antworten