Hi everyone, since there seemed to be some interest in my idea of a asyncio-enabled command line, I just sat down and wrote it. I submitted the parts that would need to go into CPython as Issue 22412 to the Python bug tracker. I added a simple command line interpreter, based on code.InteractiveConsole, which will allow for uses like
from asyncio import sleep yield from sleep(10)
The following code is mostly a copy of InteractiveConsole, with the appropriate yield froms stuck in (and comments removed. Yeah!) Greeting Martin Code follows: from asyncio import get_event_loop, coroutine, input from code import InteractiveConsole import sys class AsyncConsole(InteractiveConsole): def __init__(self, locals=None, filename="<console>"): super().__init__(locals, filename) self.compile.compiler.flags |= 0x1000 @coroutine def runsource(self, source, filename="<input>", symbol="single"): try: code = self.compile(source, filename, symbol) except (OverflowError, SyntaxError, ValueError): self.showsyntaxerror(filename) return False if code is None: return True yield from self.runcode(code) return False @coroutine def runcode(self, code): try: yield from eval(code, self.locals) except SystemExit: raise except: self.showtraceback() @coroutine def push(self, line): self.buffer.append(line) source = "\n".join(self.buffer) more = yield from self.runsource(source, self.filename) if not more: self.resetbuffer() return more @coroutine def interact(self, banner=None): try: sys.ps1 except AttributeError: sys.ps1 = ">>> " try: sys.ps2 except AttributeError: sys.ps2 = "... " cprt = 'Type "help", "copyright", "credits" or "license" for more information.' if banner is None: self.write("Python %s on %s\n%s\n(%s)\n" % (sys.version, sys.platform, cprt, self.__class__.__name__)) elif banner: self.write("%s\n" % str(banner)) more = 0 while 1: try: if more: prompt = sys.ps2 else: prompt = sys.ps1 try: line = yield from input(prompt) except EOFError: self.write("\n") break else: more = yield from self.push(line) except KeyboardInterrupt: self.write("\nKeyboardInterrupt\n") self.resetbuffer() more = 0 except SystemExit: return if __name__ == "__main__": console = AsyncConsole() get_event_loop().run_until_complete(console.interact())