Hallo,Cuenta de referencia de Python y tipos
Tengo algunos problemas para entender el recuento de referencias de Python. Lo que quiero hacer es devolver una tupla de C++ a python usando el módulo 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
estoy no estaba seguro sobre el recuento de ref obj, así que intentó sys.getrefcount()
y se 3
. Creo que debería ser 2
(las funciones getrefcount
hacen una ref sí).
Ahora no puedo hacer Py_DECREF()
antes de la devolución en C++ porque el objeto se elimina. ¿Puedo disminuir el recuento de ref en Python?
edición ¿Qué ocurre con el recuento de ref cuando se llama a la función de conversión? No estoy seguro de la documentación a continuación. http://docs.python.org/library/ctypes.html#ctypes.cast
ctypes.cast (obj, tipo) Esta función es similar a la operador de conversión en C. Se devuelve una nueva instancia de tipo que apunta al mismo bloque de memoria como obj. type debe ser un tipo de puntero, y obj debe ser un objeto que pueda interpretarse como un puntero.
código
Pero creas un módulo python-c ¿verdad? Quería omitir eso y con ctypes puedes simplemente 'ctypes.cdll.LoadLibrary ('some.so')'. Entonces, el manejo del tipo de devolución es diferente. Con ctypes es 'ctypes.py_object'. Luego uso la función de conversión y no estoy seguro de cómo se maneja correctamente el recuento de ref. Ver mi edición – tauran
Sí, de hecho, eso puede ser un poco más complicado ... Traté de leer el código fuente de cast() pero no tuve tiempo suficiente para investiagte correctamente. Trataré de echar un vistazo cuando tenga el tiempo suficiente y edite mi respuesta si encuentro algo que demuestre que ctypes toma la propiedad (si es el caso, tal vez debería considerar crear directamente un objeto python-c para eliminar estos problemas . Eso es bastante fácil ya que ya estás trabajando con PyObject) – ThR37