2010-05-18 7 views
7

Version Windows de Python 2.6.4: Est-il possible de déterminer si subprocess.Popen() échoue lors de l'utilisation shell = True?Comment faire pour déterminer subprocess.Popen() a échoué lorsque shell = True

Popen() échoue avec succès lorsque le shell = 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 

Mais quand shell = True, il semble y avoir aucun moyen de déterminer si un appel Popen() a réussi ou non.

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

Idées appréciées.

Cordialement, Malcolm

Répondre

15

returncode fonctionnera, bien que ce soit None jusqu'à ce que vous ayez appelé p.poll(). poll() lui-même renverra le code d'erreur, de sorte que vous pouvez simplement faire

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

Merci à vous deux pour vos réponses. Le poll() suivi de la technique returncode est exactement la solution que je recherchais. – Malcolm

5

Dans le premier cas, il ne démarre pas, dans la seconde - il commence avec succès shell qui, à son tour, ne parvient pas à exécuter l'application. Ainsi, votre processus a été proprement généré, quitté et attend que vous vous renseignez sur son code de sortie. Donc, la chose est, sauf si votre shell ou environnement (par exemple pas de mémoire) est complètement cassé il n'y a aucun moyen Popen lui-même peut échouer. Donc, vous pouvez en toute sécurité .poll() et .wait() dessus pour obtenir toutes les mauvaises nouvelles.

Questions connexes