2000-06-28 12:07:31 -03:00
|
|
|
\section{\module{atexit} ---
|
2000-07-06 01:51:04 -03:00
|
|
|
Exit handlers}
|
2000-06-28 12:07:31 -03:00
|
|
|
|
|
|
|
\declaremodule{standard}{atexit}
|
|
|
|
\moduleauthor{Skip Montanaro}{skip@mojam.com}
|
|
|
|
\sectionauthor{Skip Montanaro}{skip@mojam.com}
|
|
|
|
\modulesynopsis{Register and execute cleanup functions.}
|
|
|
|
|
2000-06-30 13:06:19 -03:00
|
|
|
\versionadded{2.0}
|
2000-06-28 19:07:55 -03:00
|
|
|
|
2000-06-28 12:07:31 -03:00
|
|
|
The \module{atexit} module defines a single function to register
|
|
|
|
cleanup functions. Functions thus registered are automatically
|
|
|
|
executed upon normal interpreter termination.
|
|
|
|
|
|
|
|
Note: the functions registered via this module are not called when the program is killed by a
|
|
|
|
signal, when a Python fatal internal error is detected, or when
|
2000-07-06 01:51:04 -03:00
|
|
|
\function{os._exit()} is called.
|
2000-06-28 12:07:31 -03:00
|
|
|
|
|
|
|
This is an alternate interface to the functionality provided by the
|
|
|
|
\code{sys.exitfunc} variable.
|
|
|
|
\withsubitem{(in sys)}{\ttindex{exitfunc}}
|
|
|
|
|
2000-07-05 20:11:26 -03:00
|
|
|
Note: This module is unlikely to work correctly when used with other code
|
|
|
|
that sets \code{sys.exitfunc}. In particular, other core Python modules are
|
|
|
|
free to use \module{atexit} without the programmer's knowledge. Authors who
|
|
|
|
use \code{sys.exitfunc} should convert their code to use
|
|
|
|
\module{atexit} instead. The simplest way to convert code that sets
|
|
|
|
\code{sys.exitfunc} is to import \module{atexit} and register the function
|
|
|
|
that had been bound to \code{sys.exitfunc}.
|
|
|
|
|
2000-06-28 12:07:31 -03:00
|
|
|
\begin{funcdesc}{register}{func\optional{, *args\optional{, **kargs}}}
|
|
|
|
Register \var{func} as a function to be executed at termination. Any
|
|
|
|
optional arguments that are to be passed to \var{func} must be passed
|
|
|
|
as arguments to \function{register()}.
|
|
|
|
|
|
|
|
At normal program termination (for instance, if
|
|
|
|
\function{sys.exit()} is called or the main module's execution
|
|
|
|
completes), all functions registered are called in last in, first out
|
|
|
|
order. The assumption is that lower level modules will normally be
|
|
|
|
imported before higher level modules and thus must be cleaned up
|
|
|
|
later.
|
2004-11-04 00:31:30 -04:00
|
|
|
|
2004-11-04 01:45:44 -04:00
|
|
|
If an exception is raised during execution of the exit handlers, a
|
|
|
|
traceback is printed (unless \exception{SystemExit} is raised) and the
|
|
|
|
exception information is saved. After all exit handlers have had a
|
|
|
|
chance to run the last exception to be raised is re-raised.
|
2000-06-28 12:07:31 -03:00
|
|
|
\end{funcdesc}
|
|
|
|
|
|
|
|
|
2000-09-09 00:25:11 -03:00
|
|
|
\begin{seealso}
|
|
|
|
\seemodule{readline}{Useful example of \module{atexit} to read and
|
|
|
|
write \refmodule{readline} history files.}
|
|
|
|
\end{seealso}
|
|
|
|
|
|
|
|
|
2000-06-28 12:07:31 -03:00
|
|
|
\subsection{\module{atexit} Example \label{atexit-example}}
|
|
|
|
|
|
|
|
The following simple example demonstrates how a module can initialize
|
|
|
|
a counter from a file when it is imported and save the counter's
|
|
|
|
updated value automatically when the program terminates without
|
|
|
|
relying on the application making an explicit call into this module at
|
|
|
|
termination.
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
try:
|
|
|
|
_count = int(open("/tmp/counter").read())
|
|
|
|
except IOError:
|
|
|
|
_count = 0
|
|
|
|
|
|
|
|
def incrcounter(n):
|
|
|
|
global _count
|
|
|
|
_count = _count + n
|
|
|
|
|
|
|
|
def savecounter():
|
|
|
|
open("/tmp/counter", "w").write("%d" % _count)
|
|
|
|
|
|
|
|
import atexit
|
|
|
|
atexit.register(savecounter)
|
|
|
|
\end{verbatim}
|
2003-04-08 14:46:53 -03:00
|
|
|
|
|
|
|
Positional and keyword arguments may also be passed to
|
|
|
|
\function{register()} to be passed along to the registered function
|
|
|
|
when it is called:
|
|
|
|
|
|
|
|
\begin{verbatim}
|
|
|
|
def goodbye(name, adjective):
|
|
|
|
print 'Goodbye, %s, it was %s to meet you.' % (name, adjective)
|
|
|
|
|
|
|
|
import atexit
|
|
|
|
atexit.register(goodbye, 'Donny', 'nice')
|
|
|
|
|
|
|
|
# or:
|
|
|
|
atexit.register(goodbye, adjective='nice', name='Donny')
|
|
|
|
\end{verbatim}
|