2015-03-18 2 views
1

я назвал подпроцесс таким образом:Python 3.4: проверить, если процесс заканчивается

myProc = subprocess.Popen([args],shell=False) 

мне нужно проверить, если подпроцесс закончилась из-за ошибки. Я не использовал communicate(), потому что я не хочу дожидаться завершения процесса, мне просто нужно сообщить, закончился ли подпроцесс из-за ошибки. Есть ли способ сделать это?

+0

Итак, вы хотите быть информированным асинхронно об ошибке? Вы хотите выполнить обратный вызов, если есть ошибка, или просто напечатать что-то, указывающее на наличие ошибки? Что-то другое? – dano

+0

Да, мне нужно выполнить обратный вызов, если есть ошибка, но важно не дождаться завершения процесса (потому что это бесконечный цикл), просто нужно сообщить, заканчивается ли оно ошибкой. – jul

ответ

1

Вы можете сделать это ожидание процесса до конца в фоновом потоке, и выполнение обратного вызова из этого потока:

import subprocess 
from threading import Thread 

def async_wait(proc, cb): 
    if proc.wait() != 0: 
     # If you don't need a generic async_wait, you can 
     # just execute whatever cb would do here, 
     # and not pass it in as a separate function. 
     cb(proc) 

def handle_error(proc): 
    print("%s failed!" % proc) 

myProc = subprocess.Popen(["ls", "/asdfsd"], shell=False) 
t = Thread(target=async_wait, args=(myProc, handle_error)).start() 
t.start() 
print("hi") 

Выход:

hi 
ls: cannot access /asdfsd: No such file or directory 
<subprocess.Popen object at 0x7f26d8c70210> failed! 
Смежные вопросы