Hello, I have used ctypes to wrap a C-library - it has been a really painless experience!
The C-library instantiates a quite large "container-like" structure. There are then several functions to inspect the content of the container, get at items and free the whole thing: /* C - code */ c_container_type * c_container_alloc( const char * filename ); c_node_type * c_container_get_node( c_container_type * container , const char * node_id ); void c_container_free( c_container_type * container ); .... Observe that the c_container_get_node() function does _not_ allocate memory, it just returns a opaque handle to a node structure, still fully owned by the container structure. I have wrapped this with Python/ctypes roughly like this (severly trimmed pseudo code): class Container: def __init__(self , filename): self.c_ptr = c_container_alloc( filename ) def __del__( self ): c_container_free( self.c_ptr ) def get_node( self , node_id): Node( c_container_get_node( self , node_id )) class Node: def __init__( self , c_ptr ): self.c_ptr = c_ptr def __del__( self ): pass Now, a use scenario might be like this: 1. Instantiate a Container() instance. 2. Instantiate a Node() instance with the Container.get_node() function. 3. Forget about the Container instance and work happily with the Node instance. 4. Out of the blue comes the gc - and then? Will the Node instance be enough to protect the Container instance from beeing garbage collected? I thought maybe the get_node() function should have something like a incref() call, and the Node.__del__() function a corresponding decref()? Or ?? Regards Joakim Hove -- http://mail.python.org/mailman/listinfo/python-list