python - 从内存地址创建 python 对象(使用 gi.repository)

标签 python ctypes pygobject

有时我需要调用仅存在于 C 中的 gtk/gobject 函数,但返回一个具有 python 包装器的对象。以前我使用了一个基于 ctypes 的解决方案,效果很好:

http://faq.pygtk.org/index.py?req=show&file=faq23.041.htp

既然我从 PyGtk(“import gtk”)切换到 GObject-introspection(“from gi.repository import Gtk”),我可以改用什么?

最佳答案

_PyGObject_API 接口(interface)在某些时候发生了变化。我需要删除 register_sinkfunc 函数。以下作品:

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()

从指针获取对象:

obj = capi.pygobject_new(pointer)

从 (g) 对象获取指针:

pointer = hash(obj)

我必须补充一点,就我而言,这并没有帮助我解决我的实际问题。我试图与 dconf 交互,但 dconf 返回类型为 GVariant 的值,该类型不继承自 GObject。不幸的是,PyGI/GObject 似乎没有公开将 C (*GVariant) 转换为 Python GLib.Variant 的必要函数。我猜是在那些时候,您必须放弃最初的方法并尝试一些不同的东西。

关于python - 从内存地址创建 python 对象(使用 gi.repository),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668333/

相关文章:

python - 情节 : Too many ticks on X axe

python - 计算两个日期之间的秒数差异不适用于一天以上

python - pymongo排序返回没有排序键的记录

Python ctypes : get handle to already-loaded shared libraries

python - PyCharm 无法解析 PyGObject 3.0,但代码运行正常

python - glade 3 中的自定义 python 小部件

python - 从 Flask 中的登录表单安全地发送密码

Python:从回调访问对象属性

python - 在进程之间共享一个变量

python - pygobject 创建拖放源