2011-03-28 10 views
7

Necesito un método para ejecutar un archivo de secuencia de comandos python, y si la secuencia de comandos falla con una excepción no controlada, python debe salir con un código de salida distinto de cero. Mi primer intento fue algo como esto:Código de salida cuando la secuencia de comandos python no ha sido controlada excepción

import sys 
if __name__ == '__main__': 
    try: 
     import <unknown script> 
    except: 
     sys.exit(-1) 

Pero se rompe muchos guiones, debido a la guardia __main__ utilizado a menudo. ¿Alguna sugerencia de cómo hacer esto correctamente?

+2

¿Desea * ejecutar scripts * o * importar módulos *? Si desea ejecutar scripts, puede usar el módulo ['subprocess'] (http://docs.python.org/library/subprocess.html). –

+0

Aparece una secuencia de comandos desconocida. Quiero ejecutarlo y obtener un código de salida distinto de cero si se bloquea. El subproceso no es de mucha ayuda, porque el proceso de python devolverá felizmente 0 incluso si el script arroja una excepción no controlada. – pehrs

Respuesta

11

Python ya hace lo que preguntas:

$ python -c "raise RuntimeError()" 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
RuntimeError 
$ echo $? 
1 

Después de algunas ediciones de la OP, tal vez desee:

import subprocess 

proc = subprocess.Popen(['/usr/bin/python', 'script-name']) 
proc.communicate() 
if proc.returncode != 0: 
    # Run failure code 
else: 
    # Run happy code. 

corrígeme si estoy confundido aquí.

+0

Algo se rompe seriamente con mi pitón o concha entonces, porque mi pitón insiste en fallar con 0 independientemente de lo que haga. Veré si puedo rastrear lo que sucede. Gracias por la clara explicación del comportamiento esperado. ¡Los códigos de salida de Python no están documentados en ningún lugar que haya encontrado! – pehrs

+0

Eché un vistazo y tampoco pude encontrar en ninguna parte que el código de salida estuviera documentado. Podría ser útil ver más información sobre su configuración (versión de Python, sistema operativo, secuencia de comandos que desencadena un código de retorno 0 donde cree que debería haber un código distinto de cero) para ver si podemos reproducir. – Thanatos

+0

Ubuntu 10.10, pero se actualizó varias veces y una mano compiló e instaló Python 2.6.0. Incluso algo como foo = 0/0 desencadenó el problema. Al final, la solución fue tan simple como descartar la vieja instalación de python y reemplazarla con el paquete estándar de Ubuntu. ¡Gracias por la ayuda! – pehrs

1

si desea ejecutar una secuencia de comandos dentro de una secuencia de comandos, entonces la importación no es la forma; usted podría utilizar exec si sólo se preocupan por excepciones de captura:

namespace = {} 
f = open("script.py", "r") 
code = f.read() 
try: 
    exec code in namespace 
except Exception: 
    print "bad code" 

también puede compilar el código en primer lugar con

compile(code,'<string>','exec') 

si usted está planeando para ejecutar la secuencia de comandos más de una vez y exec el resultado en el espacio de nombres

o usa el subproceso como se describe arriba, si necesita captar la salida generada por su script.

+0

Trucos interesantes. ¡Lo recordare! – pehrs

Cuestiones relacionadas