Возможный дубликат:
Обернуть подпроцесс 'stdout/stderr
В этот вопрос, hanan-n спросил, возможно ли иметь подпроцесс python, который выводит на stdout, одновременно сохраняя вывод в строке для последующей обработки. Решение в этом случае состояло в том, чтобы перебирать каждую выходную строку и печатать их вручную:
output = []
p = subprocess.Popen(["the", "command"], stdout=subprocess.PIPE)
for line in iter(p.stdout.readline, ''):
print(line)
output.append(line)
Однако это решение не обобщает на случай, когда вы хотите сделать это как для stdout, так и для stderr, удовлетворяя следующим образом:
- вывод из stdout/stderr должен перейти к родительскому процессу 'stdout/stderr соответственно
- вывод должен выполняться в реальном времени как можно больше (но мне нужен только доступ к строкам в конце)
- порядок между строками stdout и stderr не должен изменяться (я не совсем уверен, как это будет работать, если подпроцесс сбрасывает свои stdout и stderr-кеши с разными интервалами, допустим, что теперь мы получаем все в хороших кусках которые содержат полные строки?)
Я просмотрел документацию подпроцесса, но не смог найти ничего, что могло бы это сделать. Самое близкое, что я мог найти, это добавить stderr=subprocess.stdout
и использовать то же решение, что и выше, но затем мы теряем различие между регулярным выходом и ошибками. Есть идеи? Я предполагаю, что решение - если оно есть - будет включать асинхронное чтение в p.stdout
и p.stderr
.
Вот пример того, что я хотел бы сделать:
p = subprocess.Popen(["the", "command"])
p.wait() # while p runs, the command stdout and stderr should behave as usual
p_stdout = p.stdout.read() # unfortunately, this will return '' unless you use subprocess.PIPE
p_stderr = p.stderr.read() # ditto
[do something with p_stdout and p_stderr]