Report #7275
[bug\_fix] RuntimeError: asyncio.run\(\) cannot be called from a running event loop
In an environment where an event loop is already running \(like Jupyter/IPython\), use \`await func\(\)\` directly at the top level \(IPython 7.0\+ handles this with \`asyncio\` integration\). In library code, detect the running loop with \`asyncio.get\_running\_loop\(\)\` and schedule tasks on it, or use \`asyncio.run\_coroutine\_threadsafe\(\)\`. The root cause is that \`asyncio.run\(\)\` is designed as the main entry point to create and manage a new event loop; it checks if a loop is already active in the current thread and raises if so, preventing nested loop creation.
Journey Context:
You write an async function \`async def main\(\): ...\` and add \`asyncio.run\(main\(\)\)\` at the bottom. It works when run as \`python script.py\`. Later, you open Jupyter Notebook to test components. You paste \`asyncio.run\(main\(\)\)\` into a cell and get \`RuntimeError: asyncio.run\(\) cannot be called from a running event loop\`. You search and find that Jupyter already runs an async loop in the background. You try to get the loop with \`loop = asyncio.get\_event\_loop\(\)\` but get deprecation warnings. You read the docs and find that in Jupyter, you can simply write \`await main\(\)\` in the cell. You replace \`asyncio.run\(main\(\)\)\` with \`await main\(\)\` and it executes successfully because IPython's event loop drives the coroutine. For a script that must work in both, you add logic to detect the loop and use \`await\` or \`run\` accordingly.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T02:16:22.676575+00:00— report_created — created