Extension aus C aufrufen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Wie kann ich eine als Extension geschriebene Funktion 'cFunktion' mit einem Aufruf aus C wiederverwenden?

Code: Alles auswählen

static PyObject *cFunktion(PyObject *self, PyObject *args)

PyVar = Py_BuildValue("OOs", PyObj_1, PyObj_2, cString);
cFunktion(???, PyVar);
deets

Indem du gegen die extension-shared-library linkst?
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Hast du einen link oder ein Beispiel für mich?
deets

Nein, ich weiss ja noch nicht mal, was du fuer einen Compiler benutzt usw.

Aber gegen eine Bibliothek zu linken ist ja nun C-Grundwissen. Dazu findest du nun wirklich ausreichend Material. Wenn es dir konzeptuell die Sache vereinfacht, dann bau doch deine c-Funktionen in eine extra Bibliothek, und die benutzt du dann von deiner Extension genauso wie aus "purem" C/C++.
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

Ich weiß nicht wie ich die Funktion aufrufe, bzw. wie das erste Argument 'PyObject *self' deklariert/initialisiert muss.
deets

Tut mir leid, aber ich verstehe nicht, was du willst. Vergiss, was ich bis dato gesagt habe, ich glaube nicht, dass das dein Problem loest.

Was genau macht diese cfunktion, und von wo willst du sie aufrufen? Wie ist sie deklariert? Wie implementiert?
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

z.Zt. habe ich die aufrufende Funktion a in der selben c-Datei wie die zu rufende Funktion b.
Beide werden als Methoden in das selbe Python-Modul kompiliert.
Mit Python starte ich die Funktion a welche wiederum eigenständig Funktion b aufrufen soll.
Da Funktion b zu einem anderem Zeitpunkt auch von Python aufgerufen werden soll, muss diese auch als eine Methode des Python Moduls deklariert sein.

Code: Alles auswählen

static PyObject *cFunktion_b(PyObject *self, PyObject *args){
    ...
}

static PyObject *cFunktion_a(PyObject *self, PyObject *args){
    ...
    PyVar = Py_BuildValue("OOs", PyObj_1, PyObj_2, cString);
    cFunktion_b(???, PyVar);
    ...
}

static PyMethodDef Py_methods[] = {{"PyFunktion_a", cFunktion_a, METH_VARARGS, "Description of Funktion a"}, \
						{"PyFunktion_b", cFunktion_b, METH_VARARGS, "Description of Funktion b"}};

PyMODINIT_FUNC initExt(void){
    Py_InitModule("Extension", Py_methods);
}
BlackJack

@hypnoticum: Das erste Argument bei Funktionen ist das Modul-Objekt.

Das steht zum Beispiel ziemlich am Anfang von Extending Python with C or C++ im Abschnitt A Simple Example. Und in der Referenz bei der Beschreibung der PyMethodDef-Struktur.
deets

Ah. Und was passiert, wenn du die Funktion einfach aufrufst? Du hast doch alle benoetigten Argumente (self, das argument-tupel).

Also statt deiner Fragezeichen einfach self.
deets

@BlackJack

Ist das nicht etwas durch die Brust in's Auge hier? Wenn ich ihn richtig verstehe, will er ja im Grunde nur innerhalb einer in C implementierten Methode eine ander, ebenfalls in C implementierte Methode aufrufen.

Das sollte doch einfach nur in C machbar sein.

Dein Ansatz wuerde ja bedeuten, dass er sich erstmal relativ umstaendlich eine Referenz auf das Methoden-Objekt bezorgend muss (mit getattr(self, methodname) in C-Syntax), und dann PyCall... aufrufen. Das ist doch ziemlich umstaendlich. Es sei denn, man moechte Vererbung ermoeglichen an dieser Stelle.
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

"... will er ja im Grunde nur innerhalb einer in C implementierten Methode eine ander, ebenfalls in C implementierte Methode aufrufen."
Ich denke so kann man es beschreiben.
Eigentlich sollte ich doch mit den richtigen, Parametern die Funktion recht einfach aufrufen können.

die cFunktion_b gibt eine Referenz auf ein PyObject zurück und wird mit 'self' und 'args' wie jede andere c-Funktion aufgerufen(?).
nur was ist 'self'
BlackJack

@deets: Nach dem was hypnoticum gezeigt hat, soll eine in C implementierte Python-Funktion von einer anderen in C implementierten Python-Funktion aufgerufen werden. Und auch wirklich eine *Funktion* und keine Methode. Die C-Funktion ist ausserdem bekannt, da anscheinend sogar in der selben Übersetzungseinheit. Man kann sie also direkt aufrufen und muss nicht über das Python-Objekt mit `PyCall…` gehen.

@hypnoticum: Was `self` ist, habe ich doch im letzten Beitrag geschrieben. Mit Verweisen auf die entsprechenden Stellen in der Dokumentation!?
hypnoticum
User
Beiträge: 132
Registriert: Dienstag 15. März 2011, 15:43

@BlackJack:
Ok, "Das erste Argument bei Funktionen ist das Modul-Objekt."
Also ist es in beiden Funktionen das gleiche Objekt, sofern sie im gleichen Modul sind und ich kann tatsächlich die Fragezeichen einfach durch den Parameter 'self' ersetzen - ich probiere das mal aus

edit:
Ja danke, es klappert
Antworten