Je sais que c'est une vieille question mais je suis venu ici d'abord et puis j'ai découvert le module atexit
. Je ne connais pas encore son historique multiplateforme ou une liste complète des avertissements, mais jusqu'à présent, c'est exactement ce que je cherchais pour essayer de gérer le nettoyage après une interruption de clavier sur Linux. Je voulais juste proposer une autre façon d'aborder le problème.
Je veux effectuer un nettoyage post-sortie dans le contexte des opérations de Fabric, donc envelopper tout dans un bloc try
/except
n'était pas une option pour moi non plus. J'ai l'impression que atexit
peut convenir dans une telle situation, où votre code n'est pas au niveau supérieur du flux de contrôle.
atexit
est très capable et lisible tel quel, par exemple:
import atexit
def goodbye():
print "Vous quittez désormais le secteur Python."
atexit.register(goodbye)
Vous pouvez également l'utiliser comme un décorateur (à partir de la version 2.6; cet exemple provient de la documentation):
import atexit
@atexit.register
def goodbye():
print "Vous quittez désormais le secteur Python."
Si vous vouliez le rendre spécifique à KeyboardInterrupt
uniquement, la réponse d'une autre personne à cette question est probablement meilleure.
Mais notez que le module atexit
ne comporte que ~70 lignes de code et il ne serait pas difficile de créer une version similaire qui traite les exceptions différemment, par exemple en passant les exceptions en tant qu'arguments aux fonctions de rappel. (La limitation de atexit
qui justifierait une version modifiée: actuellement je ne peux pas concevoir de moyen pour les fonctions de rappel de sortie de savoir sur les exceptions; le gestionnaire atexit
attrape l'exception, appelle votre ou vos fonctions de rappel, puis relève cette exception. Mais vous pourriez le faire autrement.)
Pour plus d'informations, voir: