2016-10-07 3 views
0

Я пытаюсь выполнить команду следующим образом, но это STUCK в блоке try, как показано ниже, до тех пор, пока не начнется таймаут, скрипт python отлично выполнит самостоятельно самостоятельно, может кто-нибудь предположить, почему это так и как отладить это?subprocess.Popen выполнение скрипта stuck

cmd = "python complete.py" 
proc = subprocess.Popen(cmd.split(' '),stdout=subprocess.PIPE) 
print "Executing %s"%cmd 
try: 
    print "In try" **//Stuck here** 
    proc.wait(timeout=time_out) 
except TimeoutExpired as e: 
    print e 
    proc.kill() 
with proc.stdout as stdout: 
    for line in stdout: 
     print line, 
+0

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

+1

Вот почему документы явно рекомендуют вам использовать '.communicate()', особенно если вы перенаправили stdout или stderr. –

+0

@Owen, я не согласен с тем, что это обман этого конкретного вопроса - они не называют 'stdout.read()' здесь. Если бы они были, у них не было бы этой ошибки. (Теперь, если они перенаправляют stderr на отдельный FIFO, но только чтение из stdout, * then * они вернутся в эту позицию, но это не так). –

ответ

1

proc.stdout не доступен для чтения после завершения процесса. Вместо этого вам нужно прочитать его во время процесса. communicate() сделает это за вас, но так как вы не используете его, вы сами это сделаете.

Прямо сейчас, ваш процесс почти наверняка висит, пытаясь записать на его стандартный вывод - чего он не может сделать, потому что другой конец трубы не читается.

См. Также Using module 'subprocess' with timeout.

Смежные вопросы