Eclipse + Pydev: fonctions « de nettoyage » ne sont pas appelés lorsque vous appuyez sur « stop » »?

StackOverflow https://stackoverflow.com/questions/1261597

  •  12-09-2019
  •  | 
  •  

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

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top