diff options
author | Jason R. Coombs <jaraco@jaraco.com> | 2020-07-26 10:59:11 -0400 |
---|---|---|
committer | Jason R. Coombs <jaraco@jaraco.com> | 2020-07-26 12:51:58 -0400 |
commit | 6c6d69e0213c4012caa36f0087f1fe54bac62c89 (patch) | |
tree | 5a6caebde4c5de0d1d3b92005f18a6d2dc524cf5 /_distutils_hack/__init__.py | |
parent | 1251a231ad75fa649da700645690eb3c0a348f08 (diff) | |
download | external_python_setuptools-6c6d69e0213c4012caa36f0087f1fe54bac62c89.tar.gz external_python_setuptools-6c6d69e0213c4012caa36f0087f1fe54bac62c89.tar.bz2 external_python_setuptools-6c6d69e0213c4012caa36f0087f1fe54bac62c89.zip |
Move all but a small shim in override into _distutils_hack
Diffstat (limited to '_distutils_hack/__init__.py')
-rw-r--r-- | _distutils_hack/__init__.py | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/_distutils_hack/__init__.py b/_distutils_hack/__init__.py index 3ad70100..a8638344 100644 --- a/_distutils_hack/__init__.py +++ b/_distutils_hack/__init__.py @@ -1,5 +1,11 @@ import sys import os +import re +import importlib +import warnings + + +is_pypy = '__pypy__' in sys.builtin_module_names def enabled(): @@ -10,6 +16,51 @@ def enabled(): return which == 'local' +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + warnings.warn( + "Distutils was imported before Setuptools. This usage is discouraged " + "and may exhibit undesirable behaviors or errors. Please use " + "Setuptools' objects directly or at least import Setuptools first.") + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + warnings.warn("Setuptools is replacing distutils.") + mods = [name for name in sys.modules if re.match(r'distutils\b', name)] + for name in mods: + del sys.modules[name] + + +def ensure_local_distutils(): + clear_distutils() + distutils = importlib.import_module('setuptools._distutils') + distutils.__name__ = 'distutils' + sys.modules['distutils'] = distutils + + # sanity check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + warn_distutils_present() + if enabled(): + ensure_local_distutils() + + class DistutilsMetaFinder: def find_spec(self, fullname, path, target=None): if path is not None or fullname != "distutils": |