Cyclic references et C libraries

Fabien SK fabsk+news at
Wed Aug 13 10:12:19 CEST 2003


I have a problem with a python module that uses C objects. In this 
module (not mine, found on the net), I have one parent objet that 
maintains a list of child objects. The child objects have a reference on 
the parent object, so there is a cycle.
The parent object has a file handle (it is a native C object, not a 
python "file object") as a member. This handle can be used with 
functions like "lib_open", "lib_close", "lib_read_section".
My problem is that:
- I can not release the parent object in a fully automated manner, so 
there is a leak, and since there is a native object, the handle will not 
be closed. I can not modify the library to wrap the handle in a class, 
because if such a class has a "__del__" method the python garbage 
collector will not clean the cycle

I find it not funny to have leaks in Python, and to have to clean objet 
by hand.

One solution would be to wrap the parent objet in a new class 
(forwarding all the calls to the parent object). In the "__del__" method 
of this class, I would clean the list of children object, and then 
remove the reference on the parent objet so its "__del__" method will be 
called. Am I right ?

Last question: why does the python file objects not have a "__del__" 
method ? How the file can be closed when the last reference is remove ? 
If I do a simple test, there is not file leak:

class Toto:
  def __init__(self):
   self.file = open("tata")

while 1:
  a = Toto()
  b = Toto()
  a.member = b
  b.member = a

The GC can clean the cycle because the file object doesn't have a 
"__del__" method.


More information about the Python-list mailing list