aboutsummaryrefslogtreecommitdiff
path: root/python/scripts
diff options
context:
space:
mode:
authorJohn Snow <jsnow@redhat.com>2023-05-16 09:05:51 +0200
committerPaolo Bonzini <pbonzini@redhat.com>2023-05-18 08:53:51 +0200
commit68ea6d17fe531e383394573251359ab4f99f7091 (patch)
treef96c0e8f5d282d58ec9afcb6c02e9e946ff25c53 /python/scripts
parent928348949d1d04f67715fa7125e7e1fa3ff40f7c (diff)
downloadqemu-68ea6d17fe531e383394573251359ab4f99f7091.zip
qemu-68ea6d17fe531e383394573251359ab4f99f7091.tar.gz
qemu-68ea6d17fe531e383394573251359ab4f99f7091.tar.bz2
mkvenv: use pip's vendored distlib as a fallback
distlib is usually not installed on Linux distribution, but it is vendored into pip. Because the virtual environment has pip via ensurepip, we can piggy-back on pip's vendored version. This could break if they move our cheese in the future, but the fix would be simply to require distlib. If it is debundled, as it is on msys, it is simply available directly. Signed-off-by: John Snow <jsnow@redhat.com> [Move to toplevel. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'python/scripts')
-rw-r--r--python/scripts/mkvenv.py25
1 files changed, 22 insertions, 3 deletions
diff --git a/python/scripts/mkvenv.py b/python/scripts/mkvenv.py
index f17c3d3..fb91f92 100644
--- a/python/scripts/mkvenv.py
+++ b/python/scripts/mkvenv.py
@@ -69,10 +69,25 @@ from typing import (
import venv
import warnings
-import distlib.database
-import distlib.scripts
-import distlib.version
+# Try to load distlib, with a fallback to pip's vendored version.
+# HAVE_DISTLIB is checked below, just-in-time, so that mkvenv does not fail
+# outside the venv or before a potential call to ensurepip in checkpip().
+HAVE_DISTLIB = True
+try:
+ import distlib.database
+ import distlib.scripts
+ import distlib.version
+except ImportError:
+ try:
+ # Reach into pip's cookie jar. pylint and flake8 don't understand
+ # that these imports will be used via distlib.xxx.
+ from pip._vendor import distlib
+ import pip._vendor.distlib.database # noqa, pylint: disable=unused-import
+ import pip._vendor.distlib.scripts # noqa, pylint: disable=unused-import
+ import pip._vendor.distlib.version # noqa, pylint: disable=unused-import
+ except ImportError:
+ HAVE_DISTLIB = False
# Do not add any mandatory dependencies from outside the stdlib:
# This script *must* be usable standalone!
@@ -664,6 +679,10 @@ def ensure(
bellwether for the presence of 'sphinx'.
"""
print(f"mkvenv: checking for {', '.join(dep_specs)}", file=sys.stderr)
+
+ if not HAVE_DISTLIB:
+ raise Ouch("a usable distlib could not be found, please install it")
+
try:
_do_ensure(dep_specs, online, wheels_dir)
except subprocess.CalledProcessError as exc: