Eclipse + Pydev: fonctions « de nettoyage » ne sont pas appelés lorsque vous appuyez sur « stop » »?
Question
Essayer d'exécuter ce fichier dans Eclipse
class Try:
def __init__(self):
pass
def __del__(self):
print 1
a=Try()
raw_input('waiting to finish')
et en appuyant sur le bouton d'arrêt sans laisser la finition du programme n'imprime pas « 1 », i.e. la méthode del est jamais appelé. Si je tente d'exécuter le script à partir du shell et faire ctrl-c \ sys.exit « 1 » ne s'imprimé i.e. del est appelé. Même chose si je tente d'utiliser wait ():
class A:
def __enter__(self):
return None
def __exit__(self, type, value, traceback):
print 3
with A():
print 1
raw_input('Waiting')
print 2
Si je presse "stop" lorsque vous êtes invité, "3" est pas imprimé
Pourquoi? Y at-il un moyen de contourner?
Merci, Noam
La solution
En appuyant sur arrêt dans Eclipse tue d'emblée l'interprète (même si elle ne fait assez souvent). Comme l'utilisation kill
/ taskkill
, le processus ne connaît pas ce de disparition.
Ctrl + C extrait de Wikipedia ...
Control-C comme une commande d'interruption était popularisé par UNIX et adopté en d'autres systèmes. Dans les systèmes POSIX, la séquence provoque le programme actif à recevoir un signal de SIGINT. Si la programme ne précise pas comment gérer cette condition, il est mis fin. En général, un programme qui ne gère un SIGINT encore se terminer, ou au moins mettre fin à l'exécution des tâches à l'intérieur.
Ctrl+C
est un signal de commande pour interrompre le programme, mais comme vous avez pu le constater au milieu de ce paragraphe, les programmes peuvent spécifier comment traiter le signal. En Python, Ctrl + C génère une exception KeyboardInterrupt qui est normalement pris et Python sort proprement. Même si vous tuez l'interprète avec Ctrl+C
il peut le manipuler pour qu'il nettoie l'environnement avant de quitter.
J'inclus les éléments suivants parce que vous avez demandé « Est-il possible autour d'elle? »
Si vous êtes désireux d'arrêter sur les appels raw_input(...)
, vous pouvez utiliser Ctrl+Z
envoyer EOF. Je regardais autour, et il semble y avoir aucun moyen d'envoyer Ctrl+C
/ 0x03
dans Eclipse, malheureusement.
Autres conseils
docs Python:
__del__(self)
Appelée lorsque l'instance est sur le point d'être détruit. Il est également appelé un destructor. Si une classe de base a une méthode
__del__()
, la méthode de__del__()
de classe dérivée, le cas échéant, doit appeler explicitement pour assurer une bonne suppression de la partie de la classe de base de l'instance. Notez qu'il est possible (mais pas recommandé!) Pour la méthode__del__()
de reporter la destruction de l'instance en créant une nouvelle référence. Il peut alors être appelé à un moment plus tard, lorsque cette nouvelle référence est supprimée. Il est pas garanti que les méthodes de__del__()
sont appelés des objets qui existent encore lors de la sortie d'un interprète.
Si vous voulez garantir qu'une méthode est appelée utilisation avec-déclaration