2010-05-18 12 views
7

Wersja systemu Windows w wersji Python 2.6.4: Czy istnieje sposób sprawdzenia, czy podproces.spopen() kończy się niepowodzeniem podczas korzystania z powłoki = prawda?Sposób określania podprocesu.Popen() nie powiodło się, gdy shell = True

Popen() nie powiedzie się, gdy powłoka skutecznie = 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 

Ale kiedy shell = True, wydaje się, że nie da się ustalić, czy Popen() połączenie zostało nawiązane, czy nie.

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

Pomysły docenione.

Pozdrawiam, Malcolm

Odpowiedz

15

returncode będzie działać, ale będzie None, dopóki nie zadzwonisz pod numer p.poll(). poll() sam zwróci kod błędu, więc możesz po prostu zrobić:

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

Dziękuję za odpowiedzi. Sonda(), po której następuje technika kodu powrotu, jest właśnie rozwiązaniem, którego szukałem. – Malcolm

5

W pierwszym przypadku nie można uruchomić, w drugim - z powodzeniem uruchamia powłokę, która z kolei nie wykona aplikację. Więc twój proces został prawidłowo odrodzony, zakończony i czeka, aż zapytasz o kod wyjścia. Chodzi o to, , chyba że twoja powłoka lub środowisko (na przykład brak pamięci) jest całkowicie zepsute, nie ma możliwości, aby sama Popen mogła się nie powieść.

Dzięki temu można bezpiecznie uzyskać .poll() i .wait(), aby uzyskać wszystkie smutne wiadomości.

Powiązane problemy