NetBSD debundles pyexpat from python, but ensurepip needs pyexpat. Try our best to offer a helpful error message instead of just failing catastrophically.
Signed-off-by: John Snow <js...@redhat.com> --- python/scripts/mkvenv.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/python/scripts/mkvenv.py b/python/scripts/mkvenv.py index f355cb54fb..2172774403 100644 --- a/python/scripts/mkvenv.py +++ b/python/scripts/mkvenv.py @@ -126,7 +126,10 @@ def check_ensurepip(with_pip: bool) -> None: Raise a fatal exception with a helpful hint if it isn't available. """ - if with_pip and not find_spec("ensurepip"): + if not with_pip: + return + + if not find_spec("ensurepip"): msg = ( "Python's ensurepip module is not found.\n" "It's normally part of the Python standard library, " @@ -138,6 +141,19 @@ def check_ensurepip(with_pip: bool) -> None: ) raise Ouch(msg) + # ensurepip uses pyexpat, which can also go missing on us: + if not find_spec("pyexpat"): + msg = ( + "Python's pyexpat module is not found.\n" + "It's normally part of the Python standard library, " + "maybe your distribution packages it separately?\n" + "Either install pyexpat, or alleviate the need for it in the " + "first place by installing pip and setuptools for " + f"'{sys.executable}'.\n\n" + "(Hint: NetBSD's pkgsrc debundles this to e.g. 'py310-expat'.)" + ) + raise Ouch(msg) + def make_venv( # pylint: disable=too-many-arguments env_dir: Union[str, Path], -- 2.39.2