Ciao,Numero di riferimento e tipi di codice Python
Ho alcuni problemi a comprendere il conteggio dei riferimenti di Python. Quello che voglio fare è restituire una tupla da C++ a python usando il modulo ctypes.
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
Sono non era sicuro circa il conteggio ref di obj, così ho provato sys.getrefcount()
e ottenuto 3
. Penso che dovrebbe essere 2
(le funzioni getrefcount
fanno un ref stesso).
Ora non riesco a rendere Py_DECREF()
prima del ritorno in C++ perché l'oggetto viene eliminato. Posso diminuire il numero di ref in python?
modificare Cosa succede al conteggio ref quando la funzione getto si chiama? Non sono molto sicuro dalla documentazione qui sotto. http://docs.python.org/library/ctypes.html#ctypes.cast
ctypes.cast (obj, type) Questa funzione è simile all'operatore getto in C. restituisce una nuova istanza di tipo che punta allo stesso blocco di memoria come obj. type deve essere un tipo di puntatore e obj deve essere un oggetto che può essere interpretato come un puntatore.
codice
Ma si crea un modulo python-c giusto? Volevo saltare questo e con i ctype puoi semplicemente 'ctypes.cdll.LoadLibrary ('some.so')'. Quindi la gestione del tipo di ritorno è diversa. Con i ctypes è 'ctypes.py_object'. Quindi uso la funzione cast e non sono sicuro di come il conteggio ref sia gestito correttamente. Vedi la mia modifica. – tauran
Sì, certo, potrebbe essere un po 'più complicato ... Ho provato a leggere il codice sorgente di cast() ma non ho avuto abbastanza tempo per investire correttamente. Cercherò di dare un'occhiata quando avrò abbastanza tempo e modificherò la mia risposta se trovo qualcosa che dimostri che i ctype ne assumono la proprietà (se è il caso, forse dovresti considerare di creare direttamente un oggetto python-c per eliminare questi problemi Questo è abbastanza facile dato che stai già lavorando con PyObject) – ThR37