Hallo,Python-Referenzzähler und Ctypes
Ich habe einige Probleme, die Python-Referenzzahl zu verstehen. Was ich tun möchte, ist ein Tupel von C++ zu Python mit dem Ctypes-Modul zurückgeben.
C++:
PyObject* foo(...)
{
...
return Py_BuildValue("(s, s)", value1, value2);
}
Python:
pointer = c_foo(...) # c_foo loaded with ctypes
obj = cast(pointer, py_object).value
Ich bin war über die ref Graf von obj nicht sicher, so habe ich versucht, sys.getrefcount()
und bekam 3
. Ich denke, es sollte 2
sein (die getrefcount
Funktionen macht einen Ref selbst).
Jetzt kann ich Py_DECREF()
vor der Rückkehr in C++ nicht machen, weil das Objekt gelöscht wird. Kann ich die Ref-Anzahl in Python verringern?
bearbeiten Was ist mit dem Verweiszähler geschieht, wenn die Umsetzungsfunktion genannt wird? Ich bin mir nicht ganz sicher, was in der Dokumentation unten steht. http://docs.python.org/library/ctypes.html#ctypes.cast
ctypes.cast (obj, Typ) Diese Funktion ist ähnlich der Umwandlungsoperator in C. Sie eine neue Instanz des Typs zurückgibt, die auf den gleichen Speicherblock wie obj zeigt. type muss ein Zeigertyp sein, und obj muss ein Objekt sein, das als Zeiger interpretiert werden kann.
Aber Sie erstellen ein Python-C-Modul richtig? Ich wollte das überspringen und mit ctypes kann man einfach 'ctypes.cdll.LoadLibrary ('some.so')'. Die Handhabung des Rückgabetyps ist also anders. Bei Ctypes ist es 'ctypes.py_object'. Dann benutze ich die Cast-Funktion und ich bin mir nicht sicher, wie die ref count korrekt behandelt wird. Siehe meine Bearbeitung. – tauran
Ja in der Tat, das kann ein bisschen komplizierter sein ... Ich habe versucht, die Code-Quelle von cast() zu lesen, aber ich hatte nicht genug Zeit, um richtig zu untersuchen. Ich werde versuchen, einen Blick darauf zu werfen, wenn ich genug Zeit habe und meine Antwort editiere, wenn ich etwas finde, das beweist, dass ctypes das Eigentum übernimmt (wenn das der Fall ist, solltest du vielleicht ein Python-c-Objekt erstellen, um diese Probleme zu beseitigen Das ist ziemlich einfach, da Sie bereits mit PyObject arbeiten) – ThR37