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