Eclissi+Pydev:Le funzioni di “pulizia” non vengono richiamate quando si preme “stop”"?
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
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