2010-01-21 102 views
8

Estoy escribiendo un programa de Python que, si el usuario cambia las configuraciones mientras lo ejecuta, necesita reiniciarse para aplicar las configuraciones modificadas. ¿Hay alguna forma de hacer esto? Estoy pensando en algo en la línea de:Reiniciar un programa de Python

import sys 
command_line = ' '.join(sys.argv) 
# Now do something with command_line 
# Now call my custom exit procedure 

Nota: Estoy en Windows, si eso hace la diferencia

+0

en los procesos en segundo plano de UNIX normalmente usan manejadores de señal, revisen el módulo de señal en python. probablemente podría hacer lo mismo en Windows – Anycorn

+0

relacionado: [¿Es posible establecer el indicador python -O (optimizar) dentro de un script?] (http://stackoverflow.com/q/7527055/4279) – jfs

Respuesta

8

Me gustaría pasar por alto toda la angustia es muy probable que obtener de tratar de volver - arrójase y déjelo en las manos del ambiente.

Por eso, quiero decir:

  1. tener un programa de control que no hace más que ejecutar el programa (con los mismos parámetros que se le dio) en un bucle mientras el programa sale con un reinicio específica" "código". Esto podría ser tan simple como un archivo cmd o tan complejo como otro (muy simple) programa Python que usa os.system). Básicamente, siempre que el programa de control obtenga el código "reiniciar", volverá a ejecutar su programa con exactamente los mismos parámetros. Cualquier otro código hará que salga con ese código.

  2. Cuando desee salir completamente, haga salir su programa real de Python con el código de retorno 0 (o cualquier cosa que no sea el código de "reinicio" en una situación de error).

  3. Si solo desea pasar a otra iteración de su programa (para volver a leer la configuración, por ejemplo), salga con el código de "reinicio" reconocido por el programa de control.

Pero es posible que también desee volver a diseñar su aplicación para que pueda volver a leer su configuración en cualquier momento. Esto hará que todo el problema desaparezca. No mencionas por qué no es una opción, así que supongo que tienes alguna razón por la que no funcionará.

Pero, si no lo hace, ese es el camino que elegiría.

Para proporcionar un código de ejemplo para la primera opción (esto es en Windows, pero bajo Cygwin - las mismas reglas básicas deben aplicarse para Python nativo de Windows, pero se debe comprobar los valores de retorno de os.system) .:

> cat phase1.py 
#!/usr/bin/python 
import os 
status = 9 
while status == 9: 
    status = int(os.system ("./phase2.py")/256) # exit code is upper 8 bits 
    print "Controller: %d"%(status) 

 

> cat phase2.py 
#!/usr/bin/python 
import sys 
import time 
time.sleep(1) 
val = int(time.time())%10 
if val == 0: 
    rc = 0 
else: 
    rc = 9 
print "Program: %d -> %d"%(val,rc) 
sys.exit(rc) 

 

> ./phase1.py 
Program: 2 -> 9 
Controller: 9 
Program: 3 -> 9 
Controller: 9 
Program: 4 -> 9 
Controller: 9 
Program: 5 -> 9 
Controller: 9 
Program: 7 -> 9 
Controller: 9 
Program: 8 -> 9 
Controller: 9 
Program: 9 -> 9 
Controller: 9 
Program: 0 -> 0 
Controller: 0 

Puede ver el controlador utilizando un código de salida de 9 para decidir si volver a ejecutar el programa. El programa en sí es un tonto que devuelve 9 a menos que esté en un múltiplo de 10 segundos.

5

en UNIX, puede utilizar os.execl familia de funciones:

Estas funciones se ejecutan todos un nuevo programa, reemplazando el actual proceso; ellos no vuelven En Unix, el nuevo ejecutable se carga en el proceso actual y tendrá el mismo ID de proceso que el que llama. Los errores se informarán como excepciones OSError.

En Windows, eche un vistazo a la familia os.spawnl, que son menos eficientes que las llamadas unix.

+0

'os.execl() 'funciona en Windows también. – jfs

Cuestiones relacionadas