2010-05-18 19 views
7

versión de Windows de Python 2.6.4: ¿Hay alguna manera de determinar si subprocess.Popen() falla cuando se utiliza la cáscara = verdad?Cómo determinar subprocess.Popen() falló cuando shell = True

Popen() falla con éxito cuando la cáscara = False

>>> import subprocess 
>>> p = subprocess.Popen('Nonsense.application', shell=False) 
Traceback (most recent call last): 
    File ">>> pyshell#258", line 1, in <module> 
    p = subprocess.Popen('Nonsense.application') 
    File "C:\Python26\lib\subprocess.py", line 621, in __init__ 
    errread, errwrite) 
    File "C:\Python26\lib\subprocess.py", line 830, in 
_execute_child 
    startupinfo) 
WindowsError: [Error 2] The system cannot find the file specified 

Pero cuando la cáscara = verdad, no parece haber ninguna manera de determinar si una llamada Popen() se ha realizado correctamente o no.

>>> p = subprocess.Popen('Nonsense.application', shell=True) 
>>> p 
>>> subprocess.Popen object at 0x0275FF90>>> 
>>> p.pid 
6620 
>>> p.returncode 
>>> 

Ideas apreciadas.

Saludos, Malcolm

Respuesta

15

funcionará, aunque será None hasta que haya llamado p.poll(). poll() mismo devolverá el código de error, por lo que puede hacer

if a.poll() != 0: 
    print ":(" 
+0

Gracias a ambos por sus respuestas. El sondeo() seguido de la técnica del código de retorno es exactamente la solución que estaba buscando. – Malcolm

5

En el primer caso no se puede iniciar, en el segundo - se inicia correctamente cáscara que, a su vez, no se puede ejecutar la aplicación. Por lo tanto, su proceso se generó, salió y espera a que pregunte sobre su código de salida. Por lo tanto, la cuestión es que a menos que su cáscara o el medio ambiente (por ejemplo, ninguna memoria) está completamente roto no hay manera Popen sí puede fallar.

lo tanto, puede de manera segura y .poll().wait() en él para obtener toda la triste noticia.

Cuestiones relacionadas