Python bindings

Armin Bauer armin.bauer at desscon.com
Sat Apr 10 20:57:16 EST 2004


Hi,

im working on an application where i also wrote python bindings for.
Soon i had to set a c variable on a class, so i borrowed some of the
code from dbus:

cdef class Message:
    cdef DBusMessage *msg

    def _set_msg(self, msg):
        self.msg = <DBusMessage*>msg


which is used for example here:

    def borrow_message(self):
    	m = Message(_create=0)
        m._set_msg(<object>dbus_connection_borrow_message(self.conn))
        return m

your approach gave me unpredictable segfaults but i found no other way
so i asked the pyrex list. Here is the answer:

<snip>
It looks like you're trying to smuggle a non-Python pointer into the
_set_struct1 method by pretending it's a Python object. That won't
work.

You should NEVER cast a pointer to a Python type unless it really and
truly points to a Python object. Crashing and burning is guaranteed to
result.
</snip>

Here is how it should look like for the message example above:

cdef class Message:
    cdef DBusMessage *msg

    #get rid of the _set method here


the other code would look like this:

    def borrow_message(self):
	cdef Message m
    	m = Message(_create=0)
        m.msg  = dbus_connection_borrow_message(self.conn)
        return m


This fix will probably also get rid of errors like these:

# FIXME: this is a major major hack. We use this because casting values
to
# python objects and returning seemed to be corrupting them. This is a
"global variable" :-(

Best Regards, Armin Bauer




More information about the dbus mailing list