подпроцесс Popen.process.stdout.readline зависает случайным образом - PullRequest
0 голосов
/ 17 января 2020

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

Итак, что я упростил до этого кода:

process = subprocess.Popen([executable, "-b", paramValue], 
            stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, universal_newlines=True, bufsize=1)
# clear some startup message, which for some reason is written into stderr
process.stderr.readline()

while 100k+ loops:
    process.stdin.write(txtInputLine)
    resultLine = process.stdout.readline().strip()
    processData(txtInputLine, resultLine)

Через некоторое время, часто через 30 минут после l oop запустил программу зависает и перестает работать. Похоже, readline () просто руки и перестает работать полностью.

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

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

1 Ответ

0 голосов
/ 17 января 2020

Проблема заключалась в некоторых выводах на stderr, которые никогда не читались и заканчивали тем, что блокировали все. Настройка stderr для записи в devnull решила проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...