La interfaz _PyGObject_API
ha cambiado en algún momento. Necesitaba soltar la función register_sinkfunc
. Las siguientes obras:
from gi.repository import Gio, GLib
import gi
import ctypes
class _PyGObject_Functions(ctypes.Structure):
_fields_ = [
('register_class',
ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.c_char_p,
ctypes.c_int, ctypes.py_object,
ctypes.py_object)),
('register_wrapper',
ctypes.PYFUNCTYPE(ctypes.c_void_p, ctypes.py_object)),
('lookup_class',
ctypes.PYFUNCTYPE(ctypes.py_object, ctypes.c_int)),
('newgobj',
ctypes.PYFUNCTYPE(ctypes.py_object, ctypes.c_void_p)),
]
class PyGObjectCPAI(object):
def __init__(self):
PyCObject_AsVoidPtr = ctypes.pythonapi.PyCObject_AsVoidPtr
PyCObject_AsVoidPtr.restype = ctypes.c_void_p
PyCObject_AsVoidPtr.argtypes = [ctypes.py_object]
addr = PyCObject_AsVoidPtr(ctypes.py_object(
gi._gobject._PyGObject_API))
self._api = _PyGObject_Functions.from_address(addr)
def pygobject_new(self, addr):
return self._api.newgobj(addr)
capi = PyGObjectCPAI()
para obtener un objeto desde un puntero:
obj = capi.pygobject_new(pointer)
para obtener un puntero de una (g) objeto:
pointer = hash(obj)
tengo que añadir, en mi caso esto no me ayudó a resolver mi problema real. Estaba tratando de interactuar con dconf, pero dconf devuelve valores de tipo GVariant, que no hereda de GObject. Parece que PyGI/GObject desafortunadamente no expone las funciones necesarias para convertir un C (* GVariant) en un Python GLib.Variant. Supongo que es en esos momentos cuando tienes que desechar tu enfoque inicial y probar algo diferente.
En teoría, eso es cierto. Sin embargo, quería utilizar una función de libdconf, y actualmente no hay ningún enlace para eso en mi sistema operativo (Ubuntu Oneric). Además, se puede pensar que uno tiene que ocuparse de una biblioteca personalizada (que no forma parte de Gtk & co.) Que devuelve un puntero a un GObject, por lo que en casos de nicho esto podría ser útil. – jdm
@jdm Ya veo, gracias por sus comentarios. – jcollado