Embedding Python in C (Py_DECREF)

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Maple99
User
Beiträge: 44
Registriert: Montag 14. September 2009, 18:08

Moin,

ich habe mal eine Frage. Ich habe mir eine kleine Klasse in Python geschrieben, die mir eine XML-Datei einliest und daraus ein Dictionary erzeugt. Diese Klasse habe ich jetzt in C verwendet. Ich laufe dort dann mit einem Iterator durch das Dictionary und hole mir wie folgt die Daten in eine C-Variable

Code: Alles auswählen

char * cVar;
PyObject * pVar;
...
pVar =  PyDict_GetItem(values, key);
PyArg_Parse(pVar, "s", &cVar);          
...
Soweit so gut. Klappt auch alles. Ich füge cVar nachher in einen Baum ein um damit weiter zu arbeiten und jetzt kommt mein Problem.
Mein Verständnis der Funktion PyArg_Parse war so das hier aus dem Python-Object ein neuer! (irgendwo wird ein malloc durchgeführt) String erstellt wird. Dies scheint aber wohl nicht gemacht zu werden, da wenn ich nach dem "PyArg_Parse(pVar, "s", &cVar)" ein Py_DECREF(pVar) ausführe, bekomme ich ein Segmentation fault, wenn ich wieder auf meine Baumstruktur zugereife. Ich vermute das es daran liegt das eben pVar und cVar auf einen Speicherbereich zeigen und ein free auf pVar sich somit auch auf cVar auswirkt.
Jetzt also die eigentliche Frage. Ist das so? Was macht denn PyArg_Parse() intern wirklich? Kann mir da jemand einen Tip geben?? Vielen vielen Dank im Voraus.

Gruß

Jonny
BlackJack

@Maple99: Wenn ich das richtig sehe darfst Du auf `pVar` gar kein `Py_DECREF()` aufrufen, weil Dir das Objekt nicht gehört. PyDict_GetItem() gibt eine "borrowed reference" zurück.
Antworten