Чтение стандартного вывода после завершения процесса - PullRequest
0 голосов
/ 11 сентября 2018

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

def connect(interface):
    proc = subprocess.Popen(['mycommand', interface], stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True)
    time.sleep(10)
    proc.terminate()
    output, err = proc.communicate()
    print(output)

К сожалению, каждый раз, когда он застревает при чтении вывода.Я также пытался использовать proc.read() вместо communicate(), но это не решило проблему.

Какой лучший способ обработки вывода в этом случае?

Заранее большое спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

После некоторых исследований я обнаружил, что проблема возникла из буфера.Как указано в документации к модулю подпроцесса:

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

Существует два решения:

  • Используйте аргумент bufsize, чтобы установить большой размер буферадостаточно, чтобы сохранить все выходные данные, сгенерированные за время ожидания.
  • Используйте readline(), чтобы прочитать выходные данные и очистить буфер во время ожидания.Если вам это не нужно, просто отбросьте вывод.

Я выбираю второй подход;мой код выглядит следующим образом:

def connect(interface):
    stdout = []
    timeout = 60
    start_time = time.time()
    proc = subprocess.Popen(['mycommand', interface], stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=1, universal_newlines=True)
    while time.time() < start_time + timeout:
        line = proc.stdout.readline()
        stdout.append(line)
    proc.terminate()
    print(output)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...