2016-09-13 3 views
4
  child = subprocess.Popen(command, 
         shell=True, 
         env=environment, 
         close_fds=True, 
         stdout=subprocess.PIPE, 
         stderr=subprocess.STDOUT, 
         bufsize=1, 
            ) 

      subout = "" 
      with child.stdout: 
       for line in iter(child.stdout.readline, b''): 
        subout += line 
      logging.info(subout) 
      rc = child.wait() 

несколько раз (с перерывами) это висит навсегда. не уверен, если он висит на iter(child.stdout.readline) или child.wait()python subprocess.Popen hanging

я ps -ef для процесса его Попенс и этот процесс больше не существует

мне кажется, что это делать с BUFSIZE так, что child.stdout.readline происходит навсегда, но я понятия не имею, как проверить это и как это происходит периодически

Я мог бы реализовать тревогу, но им не уверен, если это уместно, как я не могу действительно сказать, является ли это просто медленный процесс popen'd или висит

давайте ssume, что либо child.stdout.readline, либо wait() вечно вечно, какие действия я могу предпринять, кроме тревоги?

ответ

5

Вы, вероятно, попав в тупик, что это explained in the documentation:

Popen.wait():

Дождитесь завершения дочернего процесса. Установите и верните атрибут returncode.

Предупреждение: Это тупик при использовании stdout=PIPE и/или stderr=PIPE и дочерний процесс генерирует достаточно вывод в трубу таким образом, что он блокирует ожидание буфера трубы OS принять больше данных. Используйте communicate(), чтобы избежать этого.

Решение заключается в использовании Popen.communicate().

+0

спасибо, что используем связь! – ealeon

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