Как определить subprocess.Popen () не удалось, когда shell = True - PullRequest
7 голосов
/ 19 мая 2010

Версия для Windows Python 2.6.4: есть ли способ определить, что не работает subprocess.Popen () при использовании shell = True?

Popen () успешно завершается ошибкой, когда 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

Но когда shell = True, кажется, нет никакого способа определить, был ли вызов Popen () успешным или нет.

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

Идеи приветствуются.

С уважением, Malcolm

Ответы [ 2 ]

15 голосов
/ 19 мая 2010

returncode будет работать, хотя будет None, пока вы не позвоните p.poll(). poll() сам вернет код ошибки, так что вы можете просто сделать

if a.poll() != 0:
    print ":("
5 голосов
/ 19 мая 2010

В первом случае он не запускается, во втором - успешно запускается оболочка, которая, в свою очередь, не запускает приложение. Таким образом, ваш процесс был правильно создан, завершен и ждет, когда вы запросите его код выхода. Итак, дело в том, , если ваша оболочка или окружение (например, нет памяти) полностью повреждено, нет никакого способа, которым Popen сам может произойти сбой .

Таким образом, вы можете безопасно .poll() и .wait(), чтобы получить все печальные новости.

...