Bonjour,
je voulais savoir s'il était possible d'agir au moment où l'utilisateur ferme la console Python liée à un script.
Bonjour,
je voulais savoir s'il était possible d'agir au moment où l'utilisateur ferme la console Python liée à un script.
Le module atexit est peut-être ce que tu cherches.
Bonsoir,
La discussion n'est pas à mon niveau mais comme le sujet est sympa...
atexit n'est qu'une solution lorsque le script se termine normalement (de même que trace_variable sous Tkinter et consorts).
Dans le cadre d'un arrêt brusque (CTRL C, arrêt de python comme par un kill sous linux, etc...) je cherche encore. A mon niveau il ne me semble pas possible d'agir sur un code à partir de lui même.
Une idée (sous linux mais le principe est là) :
Toutefois si ce code lance un script indépendant en lui envoyant son pid en argv il est possible pour le script secondaire de vérifier si le script est actif/non actif mais pas terminé/non actif et terminé. Soit :
Pour le script principal
Lancement : Création du script secondaire et lui passe son pid en argv.
Actif : traitement et pid actif.
Planté : pas le temp de créer le fichier trace. pid n'existe plus et le fichier trace n'est pas créer.
Fin du script : Création du fichier trace dans le temp.
Pour le script secondaire
Actif : le pid existe
Non actif mais pas terminé : le pid n'existe plus mais le fichier trace de fin de script n'est pas crée. Relance du script et récup de son pid.
Non actif et fini : le pid existe et le fichier trace aussi : je supprime le fichier trace et tout le monde quitte.
Cela se complique si c'est pour un traitement, ce qui me semble est le cas. Dans ce cas la création d'un fichier avec le dernier élément traité ralenti énormément le code.
Voili, une idée au passage...
@+
Je ne savais pas que atexit ne gèrait pas les exceptions. A vrai dire, je ne me suis jamais penché sur ce module, mais mnt que tu le dis, ça me parait un comportement assez logique.
Il reste la solution du try/finally.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 def main(): # du code if __name__ == "__main__": try: main() finally: # Code de finalisation
Bonjour,
Bien vu le finally. Sur un ctrl c cela fonctionne.
Par contre cela ne prend pas en compte une fermeture du shell (demande de rambc) ou un arrêt externe du script (kill/arrêt du processus).
Je parle dans le cadre :
Cela me semble un comportement normal. Dans le cadre d'un control c on demande l'arrêt du script et c'est intercepté. Les deux autres cas sont externes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 def main(): a = 0 while a < 10000000000: a += 1 print a if __name__ == "__main__": try: main() finally: open("/tmp/fichiertrace", "w").write('fin')
Il ne reste donc plus que deux cas à gérer.
Bonne journée.
Je sais que ma solution est moche mais pour en finir avec mon pseudo qbasic et en complément de ce que je disais.
Le script principal écrit le script de contrôle dans le temporaire, le lance et le détruit en fin de traitement.
Le script de contrôle fais le vérification de fin normale sur sa propre présence.
Après tout se passe au niveau pid/argv.
Voila pour ce qui est du retour vers l'archéologie informatique et dans l'attente de lire une solution plus 'pro'.
@+
Petit edit explicatif :
Pour le script de contrôle
Si le pid existe et que le script de contrôle existe : fonctionnement normal
Si le pid n'existe plus et que le script de contrôle existe : il y a plantage > relance du script principal avec argv et arrêt du script de contrôle (puisque relancé par le principal)
Si le pid n'existe plus et le script non plus : fin
Le fait de faire un remove sur le script de contrôle n'empêche pas son fonctionnement.
@
Partager