2010-01-20 22 views
6

Hola a todos, tengo un script que se ejecuta como unSalida elegante de un programa en Python?

while True: 
    doStuff() 

¿Cuál es la mejor manera de comunicarse con este script si necesito para detenerlo, pero no quiero matarlo si se encuentra en el medio de una operación?

Gracias!

Respuesta

7

La mejor manera es reescribir el script para que no use while True:.

Lamentablemente, es imposible conjeturar una buena manera de terminar esto.

Puede usar las señales de Linux.

Puede usar un temporizador y detenerse después de un tiempo.

Puede tener dostuff devolver un valor y detener si el valor es False.

Puede buscar un archivo local y detenerlo si el archivo existe.

Puede consultar un sitio FTP para un archivo remoto y la detención del archivo existe.

Puede consultar una página web HTTP para obtener información que indique si su ciclo debe detenerse o no.

Puede usar elementos específicos del sistema operativo como semáforos o memoria compartida.

+0

gracias por la respuesta rápida, definitivamente algunas buenas ideas que no estaba pensando. – James

5

creo que el más elegante sería:

keep_running = true 
while keep_running: 
    dostufF() 

y luego dostuff() puede establecer keep_running = false siempre en ya no quiere seguir corriendo, luego los extremos bucle while, y todo lo limpia muy bien.

2

Si se trata de una aplicación de consola y salir pulsando Ctrl + C está bien, ¿podría eso resolver su problema?

try: 
    while True: 
    doStuff() 
except KeyboardInterrupt: 
    doOtherStuff() 

supongo que el problema con este enfoque es que usted no tendría ningún control exactamente cuando y donde en hacerTarea se termina la ejecución.

7

Y asumo que te refieres a matar desde fuera del script de python.

La manera que he encontrado más fácil es

@atexit.register 
def cleanup() 
    sys.unlink("myfile.%d" % os.getpid()) 

f = open("myfile.%d" % os.getpid(), "w") 
f.write("Nothing") 
f.close() 
while os.path.exists("myfile.%d" % os.getpid()): 
    doSomething() 

Entonces para terminar el guión acaba de quitar el myfile.xxx y la aplicación debería dejar de fumar para usted. Puede usar esto incluso con varias instancias del mismo script ejecutándose al mismo tiempo si solo necesita cerrar uno. Y trata de limpiarlo por sí mismo ...

-1

El módulo de señal puede atrapar señales y reaccionar en consecuencia?

Cuestiones relacionadas