Commit b08e111b1e for qemu.org

commit b08e111b1e1dd553828360efebd4775abac5fbaf
Author: John Snow <jsnow@redhat.com>
Date:   Wed Feb 18 16:34:12 2026 -0500

    scripts: nudge users to use 'run' script for scripts that import qemu.qmp

    Now that qmp has to be installed and isn't local, we can no longer offer
    a simple forwarder for these scripts (nor path hacks) and hope that it
    works. Encourage users to use the 'run' script to use these scripts
    instead.

    Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
    Message-ID: <20260218213416.674483-18-jsnow@redhat.com>
    Signed-off-by: John Snow <jsnow@redhat.com>

diff --git a/scripts/compare-machine-types.py b/scripts/compare-machine-types.py
index b4f899082a..83be361f4f 100755
--- a/scripts/compare-machine-types.py
+++ b/scripts/compare-machine-types.py
@@ -27,19 +27,16 @@
 # along with this program; if not, see <http://www.gnu.org/licenses/>.

 import sys
-from os import path
 from argparse import ArgumentParser, RawTextHelpFormatter, Namespace
 import pandas as pd
 from contextlib import ExitStack
 from typing import Optional, List, Dict, Generator, Tuple, Union, Any, Set

 try:
-    qemu_dir = path.abspath(path.dirname(path.dirname(__file__)))
-    sys.path.append(path.join(qemu_dir, 'python'))
     from qemu.machine import QEMUMachine
 except ModuleNotFoundError as exc:
-    print(f"Module '{exc.name}' not found.")
-    print("Try export PYTHONPATH=top-qemu-dir/python or run from top-qemu-dir")
+    print(f"Module '{exc.name}' not found.", file=sys.stderr)
+    print(f"Try $builddir/run {' '.join(sys.argv)}", file=sys.stderr)
     sys.exit(1)


diff --git a/scripts/qmp/qemu-ga-client b/scripts/qmp/qemu-ga-client
index 56edd0234a..7ea01b9a11 100755
--- a/scripts/qmp/qemu-ga-client
+++ b/scripts/qmp/qemu-ga-client
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.utils import qemu_ga_client
-
-
-if __name__ == '__main__':
-    sys.exit(qemu_ga_client.main())
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qemu-ga-client [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp/qmp-shell b/scripts/qmp/qmp-shell
index 4a20f97db7..436c4940c2 100755
--- a/scripts/qmp/qmp-shell
+++ b/scripts/qmp/qmp-shell
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.qmp import qmp_shell
-
-
-if __name__ == '__main__':
-    qmp_shell.main()
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qmp-shell [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp/qmp-shell-wrap b/scripts/qmp/qmp-shell-wrap
index 9e94da114f..f63dadad1e 100755
--- a/scripts/qmp/qmp-shell-wrap
+++ b/scripts/qmp/qmp-shell-wrap
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.qmp import qmp_shell
-
-
-if __name__ == '__main__':
-    qmp_shell.main_wrap()
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qmp-shell-wrap [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp/qom-fuse b/scripts/qmp/qom-fuse
index d453807b27..7d4724a371 100755
--- a/scripts/qmp/qom-fuse
+++ b/scripts/qmp/qom-fuse
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.utils.qom_fuse import QOMFuse
-
-
-if __name__ == '__main__':
-    sys.exit(QOMFuse.entry_point())
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qom-fuse [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp/qom-get b/scripts/qmp/qom-get
index 04ebe052e8..9636353962 100755
--- a/scripts/qmp/qom-get
+++ b/scripts/qmp/qom-get
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.utils.qom import QOMGet
-
-
-if __name__ == '__main__':
-    sys.exit(QOMGet.entry_point())
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qom-get [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp/qom-list b/scripts/qmp/qom-list
index 853b85a8d3..e988274d1e 100755
--- a/scripts/qmp/qom-list
+++ b/scripts/qmp/qom-list
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.utils.qom import QOMList
-
-
-if __name__ == '__main__':
-    sys.exit(QOMList.entry_point())
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qom-list [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp/qom-set b/scripts/qmp/qom-set
index 06820feec4..c2569afdcd 100755
--- a/scripts/qmp/qom-set
+++ b/scripts/qmp/qom-set
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.utils.qom import QOMSet
-
-
-if __name__ == '__main__':
-    sys.exit(QOMSet.entry_point())
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qom-set [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp/qom-tree b/scripts/qmp/qom-tree
index 760e172277..b3cd5ab6f8 100755
--- a/scripts/qmp/qom-tree
+++ b/scripts/qmp/qom-tree
@@ -1,11 +1,10 @@
 #!/usr/bin/env python3

-import os
 import sys

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.utils.qom import QOMTree
-
-
-if __name__ == '__main__':
-    sys.exit(QOMTree.entry_point())
+print(
+    "This script has moved; after running configure,"
+    " please use '$builddir/run qom-tree [...]' instead.",
+    file=sys.stderr
+)
+sys.exit(1)
diff --git a/scripts/qmp_helper.py b/scripts/qmp_helper.py
index c1e7e0fd80..521612fb94 100755
--- a/scripts/qmp_helper.py
+++ b/scripts/qmp_helper.py
@@ -13,17 +13,12 @@
 import sys

 from datetime import datetime
-from os import path as os_path

 try:
-    qemu_dir = os_path.abspath(os_path.dirname(os_path.dirname(__file__)))
-    sys.path.append(os_path.join(qemu_dir, 'python'))
-
     from qemu.qmp.legacy import QEMUMonitorProtocol
-
 except ModuleNotFoundError as exc:
-    print(f"Module '{exc.name}' not found.")
-    print("Try export PYTHONPATH=top-qemu-dir/python or run from top-qemu-dir")
+    print(f"Module '{exc.name}' not found.", file=sys.stderr)
+    print(f"Try $builddir/run {' '.join(sys.argv)}", file=sys.stderr)
     sys.exit(1)

 from base64 import b64encode
diff --git a/scripts/render_block_graph.py b/scripts/render_block_graph.py
index 3e1a2e3fa7..b9079bbed5 100755
--- a/scripts/render_block_graph.py
+++ b/scripts/render_block_graph.py
@@ -24,9 +24,13 @@
 import json
 from graphviz import Digraph

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'python'))
-from qemu.qmp import QMPError
-from qemu.qmp.legacy import QEMUMonitorProtocol
+try:
+    from qemu.qmp import QMPError
+    from qemu.qmp.legacy import QEMUMonitorProtocol
+except ModuleNotFoundError as exc:
+    print(f"Module '{exc.name}' not found.", file=sys.stderr)
+    print(f"Try $builddir/run {' '.join(sys.argv)}", file=sys.stderr)
+    sys.exit(1)


 def perm(arr):
diff --git a/scripts/simplebench/bench_block_job.py b/scripts/simplebench/bench_block_job.py
index e575a3af10..541a47e586 100755
--- a/scripts/simplebench/bench_block_job.py
+++ b/scripts/simplebench/bench_block_job.py
@@ -25,9 +25,13 @@
 import socket
 import json

-sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', 'python'))
-from qemu.machine import QEMUMachine
-from qemu.qmp import ConnectError
+try:
+    from qemu.machine import QEMUMachine
+    from qemu.qmp import ConnectError
+except ModuleNotFoundError as exc:
+    print(f"Module '{exc.name}' not found.", file=sys.stderr)
+    print(f"Try $builddir/run {' '.join(sys.argv)}", file=sys.stderr)
+    sys.exit(1)


 def bench_block_job(cmd, cmd_args, qemu_args):
diff --git a/tests/migration-stress/guestperf/engine.py b/tests/migration-stress/guestperf/engine.py
index d8462db765..8d2ed757af 100644
--- a/tests/migration-stress/guestperf/engine.py
+++ b/tests/migration-stress/guestperf/engine.py
@@ -27,9 +27,18 @@
 from guestperf.report import Report, ReportResult
 from guestperf.timings import TimingRecord, Timings

-sys.path.append(os.path.join(os.path.dirname(__file__),
-                             '..', '..', '..', 'python'))
-from qemu.machine import QEMUMachine
+try:
+    from qemu.machine import QEMUMachine
+except ModuleNotFoundError as exc:
+    print(
+        f"Module '{exc.name}' not found.\n"
+        "It should be installed as part of the configure-time "
+        "virtual environment in $builddir/pyvenv.\n"
+        "Try re-running this script as:\n"
+        f"> $builddir/run {' '.join(sys.argv)}",
+        file=sys.stderr
+    )
+    sys.exit(1)

 # multifd supported compression algorithms
 MULTIFD_CMP_ALGS = ("zlib", "zstd", "qpl", "uadk")