Eclissi+Pydev:Le funzioni di “pulizia” non vengono richiamate quando si preme “stop”"?

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

  •  12-09-2019
  •  | 
  •  

Domanda

Tentativo di eseguire questo file in Eclipse

class Try:
   def __init__(self):
       pass
   def __del__(self):
       print 1
a=Try()
raw_input('waiting to finish')

e premendo il pulsante stop senza terminare il programma non viene stampato "1", ovvero il metodo del non viene mai chiamato.Se provo a eseguire lo script dalla shell e faccio ctrl-c\sys.exit "1" viene stampato, ovvero viene chiamato del.Stessa cosa se provo a usare 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

Se premo "stop" quando richiesto, "3" non viene stampato

Perché?C'è un modo per aggirare il problema?

Grazie, Noam

È stato utile?

Soluzione

Premendo stop in Eclipse si uccide completamente l'interprete (anche se in realtà fallisce abbastanza spesso).Come usare kill/taskkill, il processo non è consapevole della sua fine.

CTRL+C frammento da Wikipedia...

Control-C come comando abort è stato reso popolare da Unix e adottato in altri sistemi.Nei sistemi POSIX, la sequenza fa sì che il programma attivo riceva un segnale Sigint.Se il programma non specifica come gestire questa condizione, viene terminato.In genere un programma che gestisce un Sigint si terminerà comunque, o almeno termina l'attività in esecuzione al suo interno.

Ctrl+C è un segnale di controllo per interrompere il programma, ma come avrai notato a metà di quel paragrafo, i programmi possono specificare come gestire il segnale.In Python, Ctrl+C genera un'eccezione KeyboardInterrupt che normalmente viene catturato e quindi Python esce in modo pulito.Anche se stai uccidendo l'interprete con Ctrl+C può gestirlo in modo da pulire l'ambiente prima di uscire.

Ho incluso quanto segue perché hai chiesto "C'è un modo per aggirarlo?"

Se vuoi fermarti raw_input(...) chiamate, potresti usare Ctrl+Z per inviare EOF.Mi sono guardato intorno e sembra che non ci sia modo di inviare Ctrl+C/0x03 in Eclipse, sfortunatamente.

Altri suggerimenti

Documenti Python:

__del__(self)

Chiamato quando l'istanza sta per essere distrutta.Questo è anche chiamato distruttore.Se una classe base ha un file __del__() metodo, quello della classe derivata __del__() Il metodo, se presente, deve chiamarlo esplicitamente per garantire la corretta eliminazione della parte della classe base dell'istanza.Tieni presente che è possibile (sebbene non consigliato!) per il file __del__() metodo per posticipare la distruzione dell'istanza creando un nuovo riferimento ad essa.Potrebbe quindi essere richiamato in un secondo momento quando il nuovo riferimento verrà eliminato. Non è garantito __del__() i metodi vengono chiamati per oggetti che esistono ancora quando l'interprete esce.

Se vuoi garantire che un metodo venga chiamato usa il comando con-dichiarazione

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top