Асинхронно получать вывод из длинных команд оболочки с asyncio (Python 3.4+)?

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

Я не мог найти простой пример этого, даже в самой асинхронной документации , которая также выглядит довольно низкоуровневой.

    2 Solutions collect form web for “Асинхронно получать вывод из длинных команд оболочки с asyncio (Python 3.4+)?”

    Используйте get_lines() coroutines, чтобы получить команды оболочки, выводимые асинхронно, и передать сопрограммы в asyncio.as_completed() , чтобы получить результаты в том порядке, в котором они заканчиваются:

     #!/usr/bin/env python3.5 import asyncio import sys from asyncio.subprocess import PIPE, STDOUT async def get_lines(shell_command): p = await asyncio.create_subprocess_shell(shell_command, stdin=PIPE, stdout=PIPE, stderr=STDOUT) return (await p.communicate())[0].splitlines() async def main(): # get commands output concurrently coros = [get_lines('"{e}" -c "print({i:d}); import time; time.sleep({i:d})"' .format(i=i, e=sys.executable)) for i in reversed(range(5))] for f in asyncio.as_completed(coros): # print in the order they finish print(await f) if sys.platform.startswith('win'): loop = asyncio.ProactorEventLoop() # for subprocess' pipes on Windows asyncio.set_event_loop(loop) else: loop = asyncio.get_event_loop() loop.run_until_complete(main()) loop.close() 

    create_subprocess_shell – это то, что вы ищете. Он вернет экземпляр Process , с которым вы можете wait() , или communicate() с.

      Python - лучший язык программирования в мире.