54 lines
1.5 KiB
Python
Executable file
54 lines
1.5 KiB
Python
Executable file
#!/usr/bin/env python
|
|
"""
|
|
(Python >3.3)
|
|
|
|
This is an example of how we can embed a Python REPL into an asyncio
|
|
application. In this example, we have one coroutine that runs in the
|
|
background, prints some output and alters a global state. The REPL, which runs
|
|
inside another coroutine can access and change this global state, interacting
|
|
with the running asyncio application.
|
|
The ``patch_stdout`` option makes sure that when another coroutine is writing
|
|
to stdout, it won't break the input line, but instead writes nicely above the
|
|
prompt.
|
|
"""
|
|
|
|
import asyncio
|
|
|
|
from ptpython.repl import embed
|
|
|
|
loop = asyncio.get_event_loop()
|
|
counter = [0]
|
|
|
|
|
|
async def print_counter() -> None:
|
|
"""
|
|
Coroutine that prints counters and saves it in a global variable.
|
|
"""
|
|
while True:
|
|
print("Counter: %i" % counter[0])
|
|
counter[0] += 1
|
|
await asyncio.sleep(3)
|
|
|
|
|
|
async def interactive_shell() -> None:
|
|
"""
|
|
Coroutine that starts a Python REPL from which we can access the global
|
|
counter variable.
|
|
"""
|
|
print(
|
|
'You should be able to read and update the "counter[0]" variable from this shell.'
|
|
)
|
|
try:
|
|
await embed(globals=globals(), return_asyncio_coroutine=True, patch_stdout=True)
|
|
except EOFError:
|
|
# Stop the loop when quitting the repl. (Ctrl-D press.)
|
|
loop.stop()
|
|
|
|
|
|
async def main() -> None:
|
|
asyncio.create_task(print_counter())
|
|
await interactive_shell()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|