Référençant d'autres modules dans atexit
Question
J'ai une fonction qui est responsable de tuer un processus enfant lorsque le programme se termine:
class MySingleton:
def __init__(self):
import atexit
atexit.register(self.stop)
def stop(self):
os.kill(self.sel_server_pid, signal.SIGTERM)
Cependant, je reçois un message d'erreur lorsque cette fonction est appelée:
Traceback (most recent call last):
File "/usr/lib/python2.5/atexit.py", line 24, in _run_exitfuncs
func(*targs, **kargs)
File "/home/commando/Development/Diploma/streaminatr/stream/selenium_tests.py", line 66, in stop
os.kill(self.sel_server_pid, signal.SIGTERM)
AttributeError: 'NoneType' object has no attribute 'kill'
On dirait les modules os
et signal
se vide avant de procéder atexit
est appelé. les réimporter résout le problème, mais ce comportement me semble bizarre - ces modules sont importés avant enregistrer mon gestionnaire, alors pourquoi sont-ils déchargés avant mon propre gestionnaire de sortie fonctionne
La solution
Il n'y a pas de fortes garanties sur l'ordre dans lequel les choses sont détruites au moment de la fin du programme, il est donc préférable d'assurer les fonctions enregistrées atexit
-sont autonomes. Par exemple, dans votre cas:
class MySingleton:
def __init__(self):
import atexit
atexit.register(self.stop)
self._dokill = os.kill
self._thesig = signal.SIGTERM
def stop(self):
self._dokill(self.sel_server_pid, self._thesig)
Il est préférable de réimportation des modules (qui pourrait éventuellement entraîner le ralentissement de la fin du programme et même des boucles sans fin, mais ce risque est moindre pour les modules « fournis par le système », comme os
).