Процесс представляет собой простой секундомер, поэтому я могу запустить его, остановить и узнать текущее время.< /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 = 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