| # Copyright (c) Alibaba, Inc. and its affiliates. | |
| import asyncio | |
| import sys | |
| from asyncio.subprocess import PIPE, STDOUT | |
| async def run_and_get_log(*args, timeout=None): | |
| process = await asyncio.create_subprocess_exec(*args, stdout=PIPE, stderr=STDOUT) | |
| lines = [] | |
| while True: | |
| try: | |
| line = await asyncio.wait_for(process.stdout.readline(), timeout) | |
| except asyncio.TimeoutError: | |
| break | |
| else: | |
| if not line: | |
| break | |
| else: | |
| lines.append(str(line)) | |
| return process, lines | |
| def run_command_in_subprocess(*args, timeout): | |
| if sys.platform == 'win32': | |
| loop = asyncio.ProactorEventLoop() | |
| asyncio.set_event_loop(loop) | |
| else: | |
| loop = asyncio.new_event_loop() | |
| asyncio.set_event_loop(loop) | |
| process, lines = loop.run_until_complete(run_and_get_log(*args, timeout=timeout)) | |
| return (loop, process), lines | |
| def close_loop(handler): | |
| loop, process = handler | |
| process.kill() | |
| loop.close() | |