En Mon, 20 Oct 2008 10:01:07 -0200, Митя <[EMAIL PROTECTED]> escribió:
Thank you for your answers!
my g_register is a global object, and it lives all the program's
lifetime, so 'with' is not appliable. Am I right?
Why not? You could use a with statement (or try/finally) around your main
entry point.
I tried to use atexit and wrote following:
class _Register(object):
def dump(self):
....
class Registerable(object):
....
g_register = _Register()
atexit.register(g_register.dump)
...
...
g_register.add(Registerable('aa'))
But now I get:
cPickle.PicklingError: Can't pickle <class '__main__.Registerable'>:
attribute lookup __main__.Registerable failed
Does that mean that by the time of atexit execution my Registerable
class is already dead?
No, at least not due to using atexit. When atexit functions are executed,
the interpreter is still in a fully working state. From pythonrun.c,
function Py_Finalize:
/* The interpreter is still entirely intact at this point, and the
* exit funcs may be relying on that. In particular, if some thread
* or exit func is still waiting to do an import, the import machinery
* expects Py_IsInitialized() to return true. So don't say the
* interpreter is uninitialized until after the exit funcs have run.
* Note that Threading.py uses an exit func to do a join on all the
* threads created thru it, so this also protects pending imports in
* the threads created via Threading.
*/
Probably you have another problem in your code; try to use pickle alone
(not within atexit) and see what happens.
--
Gabriel Genellina
--
http://mail.python.org/mailman/listinfo/python-list