From: John Snow <jsnow@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Hanna Reitz" <hreitz@redhat.com>,
"Cleber Rosa" <crosa@redhat.com>, "John Snow" <jsnow@redhat.com>,
qemu-block@nongnu.org, "Daniel Berrangé" <berrange@redhat.com>,
"Kevin Wolf" <kwolf@redhat.com>
Subject: [PATCH 10/19] python: backport 'qmp-tui: Do not crash if optional dependencies are not met'
Date: Mon, 1 Sep 2025 16:26:52 -0400 [thread overview]
Message-ID: <20250901202702.2971212-11-jsnow@redhat.com> (raw)
In-Reply-To: <20250901202702.2971212-1-jsnow@redhat.com>
Based on the discussion at https://github.com/pypa/pip/issues/9726 -
even though the setuptools documentation implies that it is possible to
guard script execution with optional dependency groups, this is not true
in practice with the scripts generated by pip.
Just do the simple thing and guard the import statements.
Signed-off-by: John Snow <jsnow@redhat.com>
cherry picked from commit df520dcacf9a75dd4c82ab1129768de4128b554c
Signed-off-by: John Snow <jsnow@redhat.com>
---
python/qemu/qmp/qmp_tui.py | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git a/python/qemu/qmp/qmp_tui.py b/python/qemu/qmp/qmp_tui.py
index 562be008d5e..53ea6c59a71 100644
--- a/python/qemu/qmp/qmp_tui.py
+++ b/python/qemu/qmp/qmp_tui.py
@@ -21,6 +21,7 @@
import logging
from logging import Handler, LogRecord
import signal
+import sys
from typing import (
List,
Optional,
@@ -30,10 +31,20 @@
cast,
)
-from pygments import lexers
-from pygments import token as Token
-import urwid
-import urwid_readline
+
+try:
+ from pygments import lexers
+ from pygments import token as Token
+ import urwid
+ import urwid_readline
+except ModuleNotFoundError as exc:
+ print(
+ f"Module '{exc.name}' not found.",
+ "You need the optional 'tui' group: pip install qemu.qmp[tui]",
+ sep='\n',
+ file=sys.stderr,
+ )
+ sys.exit(1)
from .error import ProtocolError
from .legacy import QEMUMonitorProtocol, QMPBadPortError
--
2.50.1
next prev parent reply other threads:[~2025-09-01 20:31 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-09-01 20:26 [PATCH 00/19] python: 3.14 compatibility and python-qemu-qmp synchronization John Snow
2025-09-01 20:26 ` [PATCH 01/19] python: backport 'Change error classes to have better repr methods' John Snow
2025-09-01 20:26 ` [PATCH 02/19] python: backport 'EventListener: add __repr__ method' John Snow
2025-09-01 20:26 ` [PATCH 03/19] python: backport 'kick event queue on legacy event_pull()' John Snow
2025-09-01 20:26 ` [PATCH 04/19] python: backport 'protocol: adjust logging name when changing client name' John Snow
2025-09-01 20:26 ` [PATCH 05/19] python: backport 'drop Python3.6 workarounds' John Snow
2025-09-01 20:26 ` [PATCH 06/19] python: backport 'qmp-shell: add common_parser()' John Snow
2025-09-01 20:26 ` [PATCH 07/19] python: backport 'feat: allow setting read buffer limit' John Snow
2025-09-01 20:26 ` [PATCH 08/19] python: backport 'make require() preserve async-ness' John Snow
2025-09-01 20:26 ` [PATCH 09/19] python: backport 'qmp-shell-wrap: handle missing binary gracefully' John Snow
2025-09-01 20:26 ` John Snow [this message]
2025-09-01 20:26 ` [PATCH 11/19] python: backport 'Remove deprecated get_event_loop calls' John Snow
2025-09-01 20:26 ` [PATCH 12/19] python: backport '*really* remove get_event_loop' John Snow
2025-09-01 20:26 ` [PATCH 13/19] python: backport 'python: avoid creating additional event loops per thread' John Snow
2025-09-01 20:26 ` [PATCH 14/19] python: synchronize qemu.qmp documentation John Snow
2025-09-01 20:26 ` [PATCH 15/19] iotests: drop compat for old version context manager John Snow
2025-09-01 20:26 ` [PATCH 16/19] python: ensure QEMUQtestProtocol closes its socket John Snow
2025-09-01 20:26 ` [PATCH 17/19] iotests/147: ensure temporary sockets are closed before exiting John Snow
2025-09-01 20:27 ` [PATCH 18/19] iotests/151: ensure subprocesses are cleaned up John Snow
2025-09-01 20:27 ` [PATCH 19/19] iotests/check: always enable all python warnings John Snow
2025-09-02 16:54 ` [PATCH 00/19] python: 3.14 compatibility and python-qemu-qmp synchronization Daniel P. Berrangé
2025-09-02 16:58 ` John Snow
2025-09-02 19:34 ` Daniel P. Berrangé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250901202702.2971212-11-jsnow@redhat.com \
--to=jsnow@redhat.com \
--cc=berrange@redhat.com \
--cc=crosa@redhat.com \
--cc=hreitz@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).