[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 26/68] mkvenv: use pip's vendored distlib as a fallback
|
From: |
Paolo Bonzini |
|
Subject: |
[PULL 26/68] mkvenv: use pip's vendored distlib as a fallback |
|
Date: |
Wed, 17 May 2023 19:44:38 +0200 |
From: John Snow <jsnow@redhat.com>
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>
---
python/scripts/mkvenv.py | 25 ++++++++++++++++++++++---
python/setup.cfg | 18 ++++++++++++++++++
2 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/python/scripts/mkvenv.py b/python/scripts/mkvenv.py
index f17c3d3606ba..fb91f922d2b9 100644
--- a/python/scripts/mkvenv.py
+++ b/python/scripts/mkvenv.py
@@ -69,10 +69,25 @@
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:
diff --git a/python/setup.cfg b/python/setup.cfg
index 826a2771ba5d..fc3fae5b1076 100644
--- a/python/setup.cfg
+++ b/python/setup.cfg
@@ -125,6 +125,24 @@ ignore_missing_imports = True
[mypy-distlib.version]
ignore_missing_imports = True
+[mypy-pip]
+ignore_missing_imports = True
+
+[mypy-pip._vendor]
+ignore_missing_imports = True
+
+[mypy-pip._vendor.distlib]
+ignore_missing_imports = True
+
+[mypy-pip._vendor.distlib.database]
+ignore_missing_imports = True
+
+[mypy-pip._vendor.distlib.scripts]
+ignore_missing_imports = True
+
+[mypy-pip._vendor.distlib.version]
+ignore_missing_imports = True
+
[pylint.messages control]
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
--
2.40.1
- [PULL 19/68] python: update pylint configuration, (continued)
- [PULL 19/68] python: update pylint configuration, Paolo Bonzini, 2023/05/17
- [PULL 23/68] mkvenv: add ensure subcommand, Paolo Bonzini, 2023/05/17
- [PULL 21/68] mkvenv: add better error message for broken or missing ensurepip, Paolo Bonzini, 2023/05/17
- [PULL 24/68] mkvenv: add --diagnose option to explain "ensure" failures, Paolo Bonzini, 2023/05/17
- [PULL 22/68] mkvenv: add nested venv workaround, Paolo Bonzini, 2023/05/17
- [PULL 29/68] tests/docker: add python3-venv dependency, Paolo Bonzini, 2023/05/17
- [PULL 34/68] python/wheels: add vendored meson package, Paolo Bonzini, 2023/05/17
- [PULL 37/68] tests: Use configure-provided pyvenv for tests, Paolo Bonzini, 2023/05/17
- [PULL 41/68] Python: Drop support for Python 3.6, Paolo Bonzini, 2023/05/17
- [PULL 45/68] meson: regenerate meson-buildoptions.sh, Paolo Bonzini, 2023/05/17
- [PULL 26/68] mkvenv: use pip's vendored distlib as a fallback,
Paolo Bonzini <=
- [PULL 30/68] tests/vm: Configure netbsd to use Python 3.10, Paolo Bonzini, 2023/05/17
- [PULL 32/68] python: add vendor.py utility, Paolo Bonzini, 2023/05/17
- [PULL 33/68] configure: create a python venv unconditionally, Paolo Bonzini, 2023/05/17
- [PULL 38/68] configure: move --enable-docs and --disable-docs back to configure, Paolo Bonzini, 2023/05/17
- [PULL 36/68] qemu.git: drop meson git submodule, Paolo Bonzini, 2023/05/17
- [PULL 40/68] configure: add --enable-pypi and --disable-pypi, Paolo Bonzini, 2023/05/17
- [PULL 42/68] configure: Add courtesy hint to Python version failure message, Paolo Bonzini, 2023/05/17
- [PULL 43/68] mkvenv: mark command as required, Paolo Bonzini, 2023/05/17
- [PULL 27/68] mkvenv: avoid ensurepip if pip is installed, Paolo Bonzini, 2023/05/17
- [PULL 57/68] build: move coroutine backend selection to meson, Paolo Bonzini, 2023/05/17