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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top