Python ctypes和librsvg错误

2024-06-01 21:42:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python的ctypes包装librsvg的基本函数,但是我得到了一个segfault。在

C:

// pycairo excerpt
typedef struct {
  PyObject_HEAD
  cairo_t *ctx;
  PyObject *base; /* base object used to create context, or NULL */
} PycairoContext;

// librsvg excerpt
RsvgHandle * rsvg_handle_new_from_file (const gchar * file_name, GError ** error);
// ...
gboolean rsvg_handle_render_cairo (RsvgHandle * handle, cairo_t * cr);

Python类型:

^{pr2}$

错误发生在此行:librsvg.rsvg_handle_render_cairo(self.handle, z.ctx)

你知道这是怎么回事吗?在


Tags: 函数baserenderctypesfilecairopyobjecthandle
2条回答

问题是没有定义返回类型的规范;仅在结果上使用c_void_p不足以解决这种情况下的问题。你需要把

librsvg.rsvg_handle_new_from_file.restype = c_void_p

在适当的地方。然后它(也)在OSX中以32位或64位工作。在

但是我发现,在从文件创建句柄时,为了处理可能出现的错误,扩展基本包装更有用。下面是一个基本的包装。它还以基本相同的方式复制标准rsvg绑定的基本用法。在

^{pr2}$

示例用法见https://stackoverflow.com/a/14928770/1832154。在

在librsvg.rsvg_handle_render_cairo应为指针,而正在获取整数。不确定整个故事,但这个修改至少没有错。在

试试这个

 librsvg.rsvg_handle_render_cairo(c_void_p(self.handle), c_void_p(z.ctx))

注意,我将这两个参数包装在c_void_p中,使它们成为void*指针。不太理想,但似乎有效。在

相关问题 更多 >