[Python-de] wrapper für C

Berthold Höllmann bhoel at despammed.com
Sa Mai 5 18:49:17 UTC 2007


"Roland M. Kruggel" <rk.liste at bbf7.de> writes:

> Am Samstag, 5. Mai 2007 17:49 schrieb Christopher Arndt:
>> Roland M. Kruggel schrieb:
>> > Ich programmiere in 4GL und kann aus dieser Sprache c-Programme
>> > aufrufen. Leider keine Python-Programme.
>>
>> Was heißt hier aufrufen? Du meinst, ganz normale externe Programme
>> aus deinem Programm heraus starten? Mit fork()/exec() oder
>> system()?
>
> Nein, das meine ich nicht.
>
>> Wenn du allerdings von 4GL Zugriff auf die Daten deines
>> Pythonskripts zugreifen willst oder vice versa, dann musst du dir
>> etwas anderes überlegen. Tipp: mal nach "inter-process
>> communication" (IPC) googlen.
>
> Vllt. das auchnicht :(
>
> Ich kann z.b. von einem C-Programm auf die 4gl-variablen und 
> functionen zugreifen. Das will ich mit python machen.
>
> hier mal ein kleine c-beispiel
> --->
> #include "qxdefs.h"
>
> int get_the_key(int argc) {
>   int keycode;
>
>   keycode = uiInKey();
>
>   retint(keycode);
>   return(1);
> }
> ---<
>
> Das programm kann ich aus 4gl direkt mit einem 'call get_the_key()' 
> aufrufen.

<kleinlich_modus>
Das ist kein C Programm. 
</kleinlich_modus>

Je nach Platform, Python Umgebung und API Gestaltung der C Funktionen
bieten sich da verschiedene Wege an.

Die Standard Python Dokumentation beschreibt das vorgehen mit Hilfe
der Python C API eigendlich recht ausführlich und ausreichend.

Has du deine C Funktionalität in einer Dynamisch Linkbaren Bibliothek
unter Windows, Linux oder Mac OS X vorliegen (bei anderen UNIXen bin
ich mir unsicher) ist die ab Python 2.5 zum Standardlieferumfang
gehörende Bibliothek "ctypes" zwei oder drei Blicke Wert.

In einer Umgebung in der größere Datenmengen in Vektor oder Matrix
Form herumgereicht werden sollen, NumPy/SciPy bietet verschiedene
Mechanismen. Einige Erfahrung habe ich mit f2py, ursprünglich für das
Wrappen von FORTRAN Code gedacht, kann man inzwischen auch C
Funktionen behandeln. Bei SciPy dabei ist "weave". Hier werden die
Wrapper inline im Python Code definiert.

Des weiteren bieten sich noch an

CXX
boost.python (beide C++)
SWIG (C und C++ für verschiedene Scriptsprachen)
pyrex

und alles was ich vergessen habe.

Es gibt nicht den goldenen Weg. Ausgehende von deinen Anforderungen
mußt du dich für eine Methode entscheiden.

Hier noch ein paar Links:

 + C API <http://docs.python.org/api/api.html>

 + ctypes <http://docs.python.org/lib/module-ctypes.html>

 + CXX <http://cxx.sourceforge.net/>

 + numpy/f2py <http://cens.ioc.ee/projects/f2py2e/>

 + pyrex <http://www.cosc.canterbury.ac.nz/greg.ewing/python/Pyrex/>

 + weave <http://scipy.org/Weave>

 + SWIG <http://swig.sourceforge.net/>

 + Boost.Python <http://boost.org/libs/python/doc/index.html>

Gruß
Berthold
--