Is there an extension library?

Martin v. Löwis martin at v.loewis.de
Sat Sep 27 08:20:39 CEST 2003


"Letbetter, Jason" <letbetter at ti.com> writes:

> I'm creating Python extensions for several c/c++ components.    I'm using
> swig to create the extensions.  The biggest challenge so far is working with
> the c args between Python and the Python extension.  Is there a 3rd party
> library of extension helpers that assist in representing c-types between
> Python and c?  Are there any tips and tricks?

I suggest not to use swig, or any tools - atleast not until you fully
understand how to use these tools (I, for one, don't know how to use
swig, so I don't use it).

> 1) Refrencing and derefrencing:
> For example, condsider this c api:
> 
> void foo_alloc(void** handle_ptr);
> void foo_use(void* handle);
> 
> In c &handle.  How to get pointer to pointer in Python?
> In c *handle_ptr.  How to derefrence a pointer in Python?

I recommend to wrap this in a Python object type:

typedef struct{
  PyObject_HEAD
  void *handle;
} PyFoo;

Then, in PyFoo_New, invoke foo_alloc, and implement a method PyFoo_use
of the PyFoo objects.

> "TypeError: CharArray___setitem__() argument 3 must be char, not int"
> In c, buf[i] = (char)i, is implicit.  How do I do it in Python.  Why doesn't
> Python make this conversion implicitly?

Because in Python, characters are *not* numbers (unlike in C). In
Python, characters are strings of length 1.

Again, if you want to store chars in setitem: don't use swig, but
write it yourself.

> 3) It seems like I'm doing something unatural with my Python extension.  It
> seems someone else may have already figured out the best way to transform c
> arguments between Python and Python extensions genericly.

The best way to transform a C library into a Python extension is to
write the extension module by hand.

Regards,
Martin




More information about the Python-list mailing list