Получить асинхронный ввод из консоли в Python

Я делаю программу на Python, которая при работе может получить вход от терминала.

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

Как это сделать в Python?


Ответы (1 шт):

Автор решения: eri
import asyncio
import sys
import os

startstop = asyncio.Event()

async def main():
    print('wait start')
    await startstop.wait()
    while startstop.is_set():
        print('.',end='',flush=True)
        await asyncio.sleep(1)

def reader_cb(infile, task):
    cmd = infile.readline().strip()
    print(repr(cmd))
    if cmd == 'start':
        startstop.set()
    elif cmd == 'stop':
        startstop.clear()
    elif cmd == 'kill':
        startstop.clear()
        task.cancel()

loop=asyncio.get_event_loop()
# task = loop.create_task(main())
loop.add_reader(sys.stdin.fileno(), reader_cb, sys.stdin, task)
# loop.run_forever()
asyncio.run(main())

На Виндовс не умеет select не на сокетах. https://docs.python.org/3.6/library/asyncio-eventloops.html#asyncio.SelectorEventLoop

Переключите на ProactorEventLoop перед основным кодом.

import asyncio, sys

if sys.platform == 'win32':
    loop = asyncio.ProactorEventLoop()
    asyncio.set_event_loop(loop)

А хотя читаем дальше...

add_reader() and add_writer() are not supported

Попробуйте uvloop:

$ pip install uvloop

import asyncio
import uvloop
uvloop.install()

async def main():
    # Main entry-point.
    ...
...
asyncio.run(main())
→ Ссылка