On Sun, 27 May 2007 23:20:49 -0700, Jack wrote:

> Thanks Steven, for the reply. Very helpful. I've got a lot to learn in 
> Python :)
> 
> Some questions:
> 
>> (1) Python can automatically free most data structures and close open
>> files, but if your needs are more sophisticated, this approach may not be
>> suitable.
> 
> Since it's a wrapper of a DLL or .so file, I actually need to call 
> mylib_exit()
> to do whatever cleanup the library needs to do.

Well, there may be better ways, but I'd do something like this:


# === mylib module ===

# Exception raised if library is not initiated
class Uninitiated(Exception):
    pass


def _init():
    """Private set-up code."""
    global DATA, _INITIALIZED
    DATA = range(100000) # or something more useful
    _INITIALIZED = True

def _close():
    """Private tear-down code."""
    global DATA, _INITIALIZED
    del DATA, _INITIALIZED



def isinited():
    """Return True if the library is initialized, otherwise False."""
    try:
        _INITIALIZED; return True
    except NameError:
        return False



def init():
    """Public set-up code."""
    if not isinited():  _init()
        
def close():
    """Public tear-down code."""
    if isinited():  _close()

exit = close  # alias for exit/close.


def func():
    if isinited():
        return DATA[0]
    else:
        raise Uninitiated("Library is not initialized")


All of the above can be modified to be in a class instead of a module.
That's especially useful if you can have multiple instances, perhaps with
different state.


 
>>> 2. what's the right way to call mylib_exit()? I put it in __del__(self)
>>> but it is not being called in my simple test.
>>
>> instance.__del__ is only called when there are no references to the
>> instance.
> 
> I didn't call del explicitly. I'm expecting Python to call it when
> the program exits. I put a logging line in __del__() but I never
> see that line printed. It seems that __del__() is not being called
> even when the program exits. Any idea why?

Python tries really really hard to call instance.__del__() but there are
pathological cases where it just can't. Maybe you've found one of them. 

But I'm guessing that you may have defined a __del__ method, but not
actually created an instance. If so, __del__ will never be called.

This should work:

class Foo(object):
    def __del__(self):
        print "All gone now"

instance = Foo()


When you exit, instance will be garbage collected and instance.__del__()
will be called. But without the instance, __del__ is not called on the
class directly.


Hope this was some help,


-- 
Steven.

-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to