1111__all__ = ['dbLoadDatabase' , 'iocInit' , 'interactive_ioc' ]
1212
1313
14- epicsExit = imports .epicsExit
14+ # tie in epicsAtExit() to interpreter lifecycle
15+ @atexit .register
16+ def epicsAtPyExit ():
17+ imports .epicsExitCallAtExits ()
1518
1619
1720def iocInit (dispatcher = None ):
@@ -39,7 +42,7 @@ def iocInit(dispatcher=None):
3942
4043def safeEpicsExit (code = 0 ):
4144 '''Calls epicsExit() after ensuring Python exit handlers called.'''
42- if hasattr (sys , 'exitfunc' ): # py 2.x
45+ if hasattr (sys , 'exitfunc' ): # py 2.x
4346 try :
4447 # Calling epicsExit() will bypass any atexit exit handlers, so call
4548 # them explicitly now.
@@ -48,12 +51,13 @@ def safeEpicsExit(code=0):
4851 # Make sure we don't try the exit handlers more than once!
4952 del sys .exitfunc
5053
51- elif hasattr (atexit , '_run_exitfuncs' ): # py 3.x
54+ elif hasattr (atexit , '_run_exitfuncs' ): # py 3.x
5255 atexit ._run_exitfuncs ()
5356
5457 # calls epicsExitCallAtExits()
5558 # and then OS exit()
56- epicsExit (code )
59+ imports .epicsExit (code )
60+ epicsExit = safeEpicsExit
5761
5862# The following identifiers will be exported to interactive shell.
5963command_names = []
@@ -240,10 +244,10 @@ def call_f(*args):
240244# Hacked up exit object so that when soft IOC framework sends us an exit command
241245# we actually exit.
242246class Exiter :
243- def __repr__ (self ):
244- safeEpicsExit ( )
245- def __call__ (self ):
246- safeEpicsExit ( )
247+ def __repr__ (self ): # hack to exit when "called" with no parenthesis
248+ sys . exit ( 0 )
249+ def __call__ (self , code = 0 ):
250+ sys . exit ( code )
247251
248252exit = Exiter ()
249253command_names .append ('exit' )
@@ -312,7 +316,12 @@ def interactive_ioc(context = {}, call_exit = True):
312316 # This suppresses irritating exit message introduced by Python3. Alas,
313317 # this option is only available in Python 3.6!
314318 interact_args = dict (exitmsg = '' )
315- code .interact (local = dict (exports , ** context ), ** interact_args )
319+ try :
320+ code .interact (local = dict (exports , ** context ), ** interact_args )
321+ except SystemExit as e :
322+ if call_exit :
323+ safeEpicsExit (e .code )
324+ raise
316325
317326 if call_exit :
318- safeEpicsExit ()
327+ safeEpicsExit (0 )
0 commit comments