Ошибка сегментации ctypes при связывании rsvg - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть простая оболочка python ctypes вокруг rsvg для использования с cairo. Кажется, он работает на ubuntu 16, но когда я пробую его на ubuntu 18, я получаю ошибку сегментации. Я посмотрел на документацию в Каире пример того, как это можно сделать, поэтому ничего особенного (https://www.cairographics.org/cookbook/librsvgpython/).

from ctypes import CDLL, Structure, byref, c_byte, c_double, c_int, c_void_p
# CDLL: Instances of this class represent loaded shared libraries.
l = CDLL('librsvg-2.so.2')
class rsvgHandle():
    class RsvgDimensionData(Structure):
        _fields_ = [("width", c_int),
                    ("height", c_int),
                    ("em", c_double),
                    ("ex", c_double)]
    class PycairoContext(Structure):
        _fields_ = [("PyObject_HEAD", c_byte * object.__basicsize__),
                    ("ctx", c_void_p),
                    ("base", c_void_p)]
    def __init__(self, path):
        self.path = path
        error = ''
        self.handle = l.rsvg_handle_new_from_file(self.path, error)

    def get_dimension_data(self):
        svgDim = self.RsvgDimensionData()
        l.rsvg_handle_get_dimensions(self.handle, byref(svgDim))
        return (svgDim.width, svgDim.height)

    def render_cairo(self, ctx):
        ctx.save()
        z = self.PycairoContext.from_address(id(ctx))
        l.rsvg_handle_render_cairo(self.handle, z.ctx)
        ctx.restore()
class rsvgClass():
    def Handle(self, file):
        return rsvgHandle(file)

rsvg = rsvgClass()
svg_handle = rsvg.Handle(fpath)
svg_width, svg_height = svg_handle.get_dimension_data()[:2]
svg_handle.render_cairo(context)

Ошибка возникает внутри get_dimension_data в строке l.rsvg_handle_get_dimensions(self.handle, byref(svgDim))

Трассировка не слишком полезна, она говорит об ошибке сегментации и куче этих

/ usr / lib / x86_64- linux -gnu / librsvg-2.so.2 (rsvg_handle_get_dimensions + 0) [0x7ff70b01ed50]

/ usr / lib / x86_64- linux -gnu / libffi.so.6 (ffi_call_unix64 + 0x4 c) [0x7ff71f52adae]

/ usr / lib / x86_64- linux -gnu / libffi.so.6 (ffi_call + 0x22f) [0x7ff71f52a71f] *

/ usr / lib / python2 .7 / lib-dynload / _ctypes.x86_64- linux -gnu.so (_ctypes_callproc + 0x2a4) [0x7ff71f73dcc4]

/ usr / lib / python2 .7 / lib-dynload / _ctypes.x86_64- linux -gnu.so (+ 0x106c5) [0x7ff71f73d6c5] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0 (PyEval_EvalFrameEx + 0x5bf6) [0x7ff7247eb366] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x8b5b) [0x7ff7247ee2-64 / x 10/86 / x86 / 86) x gnu / lib python2 .7.so.1.0 (PyEval_EvalCodeEx + 0x7d8) [0x7ff72492a908] /usr/lib/x86_64-linux-gnu/libpython2.7.so.1.0(PyEval_EvalFrameEx+0x5bf6) [ 0x7ff7247eb366]

Кто-нибудь знает, что может происходить в моей среде ubuntu 18, чтобы вызвать эту проблему? Или в качестве альтернативы, как я мог бы сделать SVG в открытый каирский контекст (как показано в последней строке кода) на Ubuntu 18? (готовая python привязка для rsvg удалена из Ubuntu 18 кстати, поэтому я пытаюсь начать с ctypes)

...