Asyncio: как читать стандартный вывод из подпроцесса?Python

Программы на Python
Anonymous
Asyncio: как читать стандартный вывод из подпроцесса?

Сообщение Anonymous »

Я столкнулся с довольно простой проблемой — я не могу связаться со стандартным выводом процесса.
Процесс представляет собой простой секундомер, поэтому я могу запустить его, остановить и узнать текущее время.< /p>
Код секундомера:

Код: Выделить всё

import argparse
import time

def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument('start', type=int, default=0)

start = parser.parse_args().start

while True:
print(start)
start += 1
time.sleep(1)

if __name__ == "__main__":
main()
И его менеджер:

Код: Выделить всё

import asyncio

class RobotManager:
def __init__(self):
self.cmd = ["python", "stopwatch.py", "10"]
self.robot = None

async def start(self):
self.robot = await asyncio.create_subprocess_exec(
*self.cmd,
stdout=asyncio.subprocess.PIPE,
)

async def stop(self):
if self.robot:
self.robot.kill()
stdout = await self.robot.stdout.readline()
print(stdout)
await self.robot.wait()
self.robot = None

async def main():
robot = RobotManager()
await robot.start()
await asyncio.sleep(3)
await robot.stop()
await robot.start()
await asyncio.sleep(3)
await robot.stop()

asyncio.run(main())
Но stdout.readline каждый раз возвращает пустую строку байтов.
При изменении stdout = await self.robot.stdout.readline () в стандартный вывод, _ = await self.robot.communicate(), результатом по-прежнему будет пустая строка байтов.
При добавлении await self.robot .stdout.readline() до конца метода RobotManager.start, он зависает навсегда.
Однако при удалении stdout=asyncio.subprocess.PIPE и всех вызовов readline подпроцесс выводит данные на терминал, как и ожидалось.
Как правильно прочитать стандартный вывод подпроцесса?

Подробнее здесь: https://stackoverflow.com/questions/782 ... subprocess

Вернуться в «Python»