Eclipse + PyDev: funciones de “limpieza” no se llama al pulsar “stop” "?
Pregunta
Tratando de ejecutar este archivo en Eclipse
class Try:
def __init__(self):
pass
def __del__(self):
print 1
a=Try()
raw_input('waiting to finish')
y pulsando el botón de parada sin dejar que el programa termine no se imprime "1", es decir el método del que nunca se llama. Si trato de ejecutar la secuencia de comandos de la shell y hacer ctrl-c \ sys.exit "1" no se imprimen es decir del que se llama. Lo mismo si intento usar 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 presiono "parada" cuando se le solicite, "3" no se imprime
¿Por qué? ¿Hay una manera de evitarlo?
Gracias, Noam
Solución
Al pulsar parada en Eclipse mata de plano la intérprete (aunque en realidad no muy a menudo). Como el uso de kill
/ taskkill
, el proceso no es consciente de que la desaparición.
Ctrl + C fragmento de Wikipedia ...
Control-C como un comando de interrupción era popularizado por UNIX y adoptado en otros sistemas. En sistemas POSIX, la secuencia hace que el programa activo para recibir una señal SIGINT. Si el Programa no especifica cómo manejar esta condición, se termina. Típicamente un programa que surte manejar un SIGINT todavía terminará en sí, o al menos terminar la tarea en ejecución dentro de él.
Ctrl+C
es una señal de control para interrumpir el programa, pero como usted puede haber notado en medio de ese párrafo, programas puede especificar cómo manejar la señal. En Python, Ctrl + C produce una excepción KeyboardInterrupt que normalmente es atrapado y luego Python sale limpiamente. Incluso si usted está matando el intérprete con Ctrl+C
puede manejarlo de manera que se limpia el medio ambiente antes de salir.
I incluyen los siguientes, ya que se le pregunte "¿Hay una manera de evitarlo?"
Si estás interesado en parar en llamadas raw_input(...)
, se puede usar para enviar Ctrl+Z
EOF. Miré a mi alrededor, y no parece haber ninguna manera de enviar Ctrl+C
/ 0x03
en Eclipse, por desgracia.
Otros consejos
documentación de Python:
__del__(self)
llama cuando la instancia está a punto de ser destruido. Esto también se llama un destructor. Si una clase base tiene un método
__del__()
, método__del__()
de la clase derivada, en su caso, debe llamar explícitamente que para garantizar la eliminación adecuada de la parte de la clase base de la instancia. Tenga en cuenta que es posible (aunque no se recomienda!) Para el método__del__()
posponer la destrucción de la instancia mediante la creación de una nueva referencia a la misma. Se puede entonces ser llamado en un momento posterior cuando se elimina esta nueva referencia. No se garantiza que los métodos__del__()
se llaman los objetos que aún existen al salir del intérprete.
Si usted quiere garantizar que un método es llamado el uso con-declaración