View previous topic :: View next topic |
Author |
Message |
oscarwild l33t
Joined: 15 Jul 2003 Posts: 857 Location: Memmingen, Germany, Old Europe, Earth
|
Posted: Fri Mar 21, 2008 12:04 pm Post subject: C-Headers in python parsen/benutzen |
|
|
Hallo,
ich suche eine Lösung für folgendes Problem:
Gegeben ist ein C-Headerfile, in dem ein oder mehrere structs definiert sind, also in der Art
Code: | typedef struct
{
uint16 x;
uint16 y;
sint8 z;
} foo_t |
Gibt es irgend eine Möglichkeit, das Headerfile in Python zu importieren, so dass ich die dort definierten Strukturen/Unions nutzen kann?
Mein Ziel ist es, den Adressoffset jeder Variable (analog offsetof(foo_t, <Variable>) in C) ermitteln zu können. Ob der Header dazu importiert, geparst oder anderweitig konvertiert wird, ist vollkommen egal - Voraussetzung ist alleine, dass es automatisch vonstatten geht.
Hat irgendwer einen Lösungsansatz parat?
Gruß + frohe Ostern
OscarWild _________________ http://blog.selbsthilfenetzwerk-cannabis-medizin.de |
|
Back to top |
|
|
Necoro Veteran
Joined: 18 Dec 2005 Posts: 1912 Location: Germany
|
Posted: Sat Mar 22, 2008 1:01 am Post subject: |
|
|
Schaust du dir an: Cython oder Pyrex oder SWIG ... für automatische Generierung ist wahrscheinlich letzteres am besten... _________________ Inter Deum Et Diabolum Semper Musica Est. |
|
Back to top |
|
|
oscarwild l33t
Joined: 15 Jul 2003 Posts: 857 Location: Memmingen, Germany, Old Europe, Earth
|
|
Back to top |
|
|
DarKRaveR Guru
Joined: 11 Oct 2003 Posts: 500 Location: Old Europe/G-Many
|
Posted: Fri Apr 04, 2008 5:54 am Post subject: |
|
|
Swif ist mehr ein Interface Generator, ala IDL etc.
Aus dem Header die Offsets parsen ist unmöglich, weil diese sich erst beim compilen in Abhängigkeit der Implementation/Platform ergeben, zumindest aber wäre es ne verdammt schlechte Idee.
Apropos, was passiert wenn man gegen eine lib linked, deren header man hat und die ein anderes Packing Pragma hat, als der zu compilende Source?
Wenn Du in Python eine C Bibliothek verwenden möchtest, dann solltest Du Dir mal die embedding und extending guide anschauen. |
|
Back to top |
|
|
oscarwild l33t
Joined: 15 Jul 2003 Posts: 857 Location: Memmingen, Germany, Old Europe, Earth
|
Posted: Fri Apr 04, 2008 8:31 am Post subject: |
|
|
Hallo DarKRaveR,
DarKRaveR wrote: | Swif ist mehr ein Interface Generator, ala IDL etc.
Aus dem Header die Offsets parsen ist unmöglich, weil diese sich erst beim compilen in Abhängigkeit der Implementation/Platform ergeben, zumindest aber wäre es ne verdammt schlechte Idee.
|
Auf dieses Problem bin ich auch gestoßen, allerdings verwendet das Target kein besonderes Alignment, und es kommen keine nativen Datentypen, sondern nur welche mit definierter Bitsize zum Einsatz (wobei ein externer Generator das natürlich nicht wissen kann).
DarKRaveR wrote: |
Apropos, was passiert wenn man gegen eine lib linked, deren header man hat und die ein anderes Packing Pragma hat, als der zu compilende Source?
Wenn Du in Python eine C Bibliothek verwenden möchtest, dann solltest Du Dir mal die embedding und extending guide anschauen. |
Nein, so wild ist das ganze gar nicht. Die Datensätze landen auf einem embedded Target, auf das ich per I2C-Bus zugreife, und zwar über die Speicheradressen.
Bisher müssen die Offsets zu den Strukturen von Hand gepflegt werden, und es sind leider sehr viele Strukturen, was die Handarbeit ziemlich fehlerträchtig und aufwändig macht... in C fehlt leider die Möglichkeit der Reflexion. _________________ http://blog.selbsthilfenetzwerk-cannabis-medizin.de |
|
Back to top |
|
|
DarKRaveR Guru
Joined: 11 Oct 2003 Posts: 500 Location: Old Europe/G-Many
|
Posted: Fri Apr 04, 2008 8:52 am Post subject: |
|
|
Spräche denn dann etwas dagegen ein C modul für Python zu proggen, welches basierend auf deinen headern die Daten aquiriet und in passende Python Typen ablegt, sodaß Du dieses dann importieren kannst (in Python). Ich hatte es zumindest so verstanden, daß Du aus Python die Daten manipulieren (oder zumindest lesen) möchtest.
Die Idee: Man schreibe ein C-Modul, als Pythonerweiterung, dieses kann auch eigene Python Datentypen 'einführen' (definieren), welches auch Deine besagten Header verwendet. Im Prinzip also ein 'wrapper', das ganze schreibst Du in C, es wird ein DSO (Dynamic Shared Object), das für python die passenden Funktionen und Datentypen exportiert, selbst auf die besagten header zurückgreift und direkt Dein IO oder systemcalls etc. macht. einmal compiliert hast Du dann ein .so, welches du in site-packages wirfst und das Du dann mit 'import meinmodul' in Python verwenden kannst.
Siehe: http://docs.python.org/ext/intro.html
Und dann die vollständige Referenz: http://docs.python.org/api/api.html
Hoffe das hilft Dir weiter.
Genau auf dem Prinzip arbeiten Sachen wie PyGtk, opengl Anbindung etc. pp. (Ist im Prinzip ein Pendant zu JNI bei Java) |
|
Back to top |
|
|
Necoro Veteran
Joined: 18 Dec 2005 Posts: 1912 Location: Germany
|
Posted: Fri Apr 04, 2008 10:20 am Post subject: |
|
|
DarkRaveR: Ich wollte dich nur drauf hinweisen:
- wenn man Python-Erweiterungen um eine bestehende C-lib herum schreiben will, sollte man SWIG nehmen, anstatt selber auf C-Level mit der Python-API zu arbeiten (es sei denn man ist scharf darauf sich in der INCREF/DECREF-Hölle zu verlaufen). Da ich für solche Sachen persönlich auch SWIG nutze, weiß ich, dass es geht. Das IDL-ähnlich, von dem du sprichst, sind wohl die .i Dateien, die man anlegen muss, um zu sagen was man wrappen muss. - Daraus werden dann aber Python-Module erzeugt (oder auch Perl/Java/R/Scheme...)
- wenn es mit einfach wrappen nicht geht, ist es zugegebenermaßen mit SWIG manchmal aufwendig - an der Stelle empfiehlt sich Pyrex/Cython. (Auch diese benutze ich persönlich)...
Die Python-C-API braucht man zwar teilweise auch bei den beiden ansätzen - aber nur auf die API zu bauen gleicht quasi einem Kopfschuss....
/edit: DarKRaveR wrote: | Genau auf dem Prinzip arbeiten Sachen wie PyGtk, opengl Anbindung etc. pp. (Ist im Prinzip ein Pendant zu JNI bei Java) |
naja ... pygtk verwendet auch wrapperprogramme (halt glib eigene) ... also das ist auch nicht handgecodet _________________ Inter Deum Et Diabolum Semper Musica Est. |
|
Back to top |
|
|
DarKRaveR Guru
Joined: 11 Oct 2003 Posts: 500 Location: Old Europe/G-Many
|
Posted: Fri Apr 04, 2008 5:54 pm Post subject: |
|
|
Ah, okay, ich habe persönlich noch nicht wirklich swig benutzt (nur mal die Doku überflogen) und hatte den Eindruck, daß man eben ein Interface damit generieren kann - Wenn sich das bei Python praktisch für Module verwenden lässt, dann nur zu, man muß sich ja nicht quälen, sehe ich genauso.
Ich sag ja nur, daß eine Extension definitiv das PRoblem löst, wie er sich die zusammenbastelt sei mal freigestellt. Eventuell kannst Du ja kurz nen Abriss machen, wie das in Swig laufen würde, um damit ein Skelett des Moduls zu bekommen, das würde Ihm sicherlich helfen .
Der vollständigkeit halber für den OP:
http://www.swig.org/Doc1.3/Python.html |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|