On Tue, Jul 15, 2025 at 12:54:26PM +0200, Miro Hrončok wrote: > On 15. 07. 25 12:51, Richard W.M. Jones wrote: > >In Python 3.14, no asyncio event loop gets generated automatically. > >Instead create one when we need it. This should work with Python 3.13 > >as well. This is a mechanical change as suggested here: > > > >https://bugzilla.redhat.com/show_bug.cgi?id=2375004#c4 > > > >See-also: https://docs.python.org/3.14/whatsnew/3.14.html#id7 > >Thanks: Miro Hrončok > >Signed-off-by: Richard W.M. Jones <rjo...@redhat.com> > >--- > > python/qemu/qmp/legacy.py | 5 ++++- > > python/qemu/qmp/qmp_tui.py | 5 ++++- > > python/qemu/qmp/util.py | 5 ++++- > > python/tests/protocol.py | 5 ++++- > > 4 files changed, 16 insertions(+), 4 deletions(-) > > > >diff --git a/python/qemu/qmp/legacy.py b/python/qemu/qmp/legacy.py > >index 22a2b5616e..e11d05afbd 100644 > >--- a/python/qemu/qmp/legacy.py > >+++ b/python/qemu/qmp/legacy.py > >@@ -86,7 +86,10 @@ def __init__(self, > > "server argument should be False when passing a socket") > > self._qmp = QMPClient(nickname) > >- self._aloop = asyncio.get_event_loop() > >+ try: > >+ self._aloop = asyncio.get_event_loop() > >+ except RuntimeError: > >+ self._aloop = asyncio.new_event_loop() > > self._address = address > > self._timeout: Optional[float] = None > >diff --git a/python/qemu/qmp/qmp_tui.py b/python/qemu/qmp/qmp_tui.py > >index 2d9ebbd20b..84c5da4e66 100644 > >--- a/python/qemu/qmp/qmp_tui.py > >+++ b/python/qemu/qmp/qmp_tui.py > >@@ -377,7 +377,10 @@ def run(self, debug: bool = False) -> None: > > screen = urwid.raw_display.Screen() > > screen.set_terminal_properties(256) > >- self.aloop = asyncio.get_event_loop() > >+ try: > >+ self.aloop = asyncio.get_event_loop() > >+ except RuntimeError: > >+ self.aloop = asyncio.new_event_loop() > > self.aloop.set_debug(debug) > > # Gracefully handle SIGTERM and SIGINT signals > >diff --git a/python/qemu/qmp/util.py b/python/qemu/qmp/util.py > >index ca6225e9cd..8f9f849a5f 100644 > >--- a/python/qemu/qmp/util.py > >+++ b/python/qemu/qmp/util.py > >@@ -160,7 +160,10 @@ def asyncio_run(coro: Coroutine[Any, Any, T], *, debug: > >bool = False) -> T: > > return asyncio.run(coro, debug=debug) > > # Python 3.6 > >- loop = asyncio.get_event_loop() > >+ try: > >+ loop = asyncio.get_event_loop() > >+ except RuntimeError: > >+ loop = asyncio.new_event_loop() > > loop.set_debug(debug) > > ret = loop.run_until_complete(coro) > > loop.close() > > This one particular addition should not be necessary as it only runs > on Python 3.6. This code is not reached on Python 3.7+ and hence it > is not reached on Python 3.14.
Yup, even says it in the comment :-) I'll submit a v2 in a little while, in case there is any other feedback. Rich. > >diff --git a/python/tests/protocol.py b/python/tests/protocol.py > >index 56c4d441f9..aa7c0e4397 100644 > >--- a/python/tests/protocol.py > >+++ b/python/tests/protocol.py > >@@ -228,7 +228,10 @@ def async_test(async_test_method): > > Decorator; adds SetUp and TearDown to async tests. > > """ > > async def _wrapper(self, *args, **kwargs): > >- loop = asyncio.get_event_loop() > >+ try: > >+ loop = asyncio.get_event_loop() > >+ except RuntimeError: > >+ loop = asyncio.new_event_loop() > > loop.set_debug(True) > > await self._asyncSetUp() > > -- > Miro Hrončok > -- > Phone: +420777974800 > Fedora Matrix: mhroncok -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones Read my programming and virtualization blog: http://rwmj.wordpress.com Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 100 libraries supported. http://fedoraproject.org/wiki/MinGW