| 
									
										
										
										
											2000-06-28 15:07:31 +00:00
										 |  |  | \section{\module{atexit} --- | 
					
						
							| 
									
										
										
										
											2000-07-06 04:51:04 +00:00
										 |  |  |          Exit handlers} | 
					
						
							| 
									
										
										
										
											2000-06-28 15:07:31 +00: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 16:06:19 +00:00
										 |  |  | \versionadded{2.0} | 
					
						
							| 
									
										
										
										
											2000-06-28 22:07:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-28 15:07:31 +00: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 04:51:04 +00:00
										 |  |  | \function{os._exit()} is called. | 
					
						
							| 
									
										
										
										
											2000-06-28 15:07:31 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | This is an alternate interface to the functionality provided by the | 
					
						
							|  |  |  | \code{sys.exitfunc} variable. | 
					
						
							|  |  |  | \withsubitem{(in sys)}{\ttindex{exitfunc}} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-07-05 23:11:26 +00: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 15:07:31 +00: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. | 
					
						
							|  |  |  | \end{funcdesc} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-09-09 03:25:11 +00:00
										 |  |  | \begin{seealso} | 
					
						
							|  |  |  |   \seemodule{readline}{Useful example of \module{atexit} to read and | 
					
						
							|  |  |  |                        write \refmodule{readline} history files.} | 
					
						
							|  |  |  | \end{seealso} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2000-06-28 15:07:31 +00: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} |