Mercurial > repos > shellac > sam_consensus_v3
comparison env/lib/python3.9/site-packages/_distutils_hack/__init__.py @ 0:4f3585e2f14b draft default tip
"planemo upload commit 60cee0fc7c0cda8592644e1aad72851dec82c959"
author | shellac |
---|---|
date | Mon, 22 Mar 2021 18:12:50 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:4f3585e2f14b |
---|---|
1 import sys | |
2 import os | |
3 import re | |
4 import importlib | |
5 import warnings | |
6 | |
7 | |
8 is_pypy = '__pypy__' in sys.builtin_module_names | |
9 | |
10 | |
11 def warn_distutils_present(): | |
12 if 'distutils' not in sys.modules: | |
13 return | |
14 if is_pypy and sys.version_info < (3, 7): | |
15 # PyPy for 3.6 unconditionally imports distutils, so bypass the warning | |
16 # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 | |
17 return | |
18 warnings.warn( | |
19 "Distutils was imported before Setuptools, but importing Setuptools " | |
20 "also replaces the `distutils` module in `sys.modules`. This may lead " | |
21 "to undesirable behaviors or errors. To avoid these issues, avoid " | |
22 "using distutils directly, ensure that setuptools is installed in the " | |
23 "traditional way (e.g. not an editable install), and/or make sure " | |
24 "that setuptools is always imported before distutils.") | |
25 | |
26 | |
27 def clear_distutils(): | |
28 if 'distutils' not in sys.modules: | |
29 return | |
30 warnings.warn("Setuptools is replacing distutils.") | |
31 mods = [name for name in sys.modules if re.match(r'distutils\b', name)] | |
32 for name in mods: | |
33 del sys.modules[name] | |
34 | |
35 | |
36 def enabled(): | |
37 """ | |
38 Allow selection of distutils by environment variable. | |
39 """ | |
40 which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') | |
41 return which == 'local' | |
42 | |
43 | |
44 def ensure_local_distutils(): | |
45 clear_distutils() | |
46 distutils = importlib.import_module('setuptools._distutils') | |
47 distutils.__name__ = 'distutils' | |
48 sys.modules['distutils'] = distutils | |
49 | |
50 # sanity check that submodules load as expected | |
51 core = importlib.import_module('distutils.core') | |
52 assert '_distutils' in core.__file__, core.__file__ | |
53 | |
54 | |
55 def do_override(): | |
56 """ | |
57 Ensure that the local copy of distutils is preferred over stdlib. | |
58 | |
59 See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 | |
60 for more motivation. | |
61 """ | |
62 if enabled(): | |
63 warn_distutils_present() | |
64 ensure_local_distutils() | |
65 | |
66 | |
67 class DistutilsMetaFinder: | |
68 def find_spec(self, fullname, path, target=None): | |
69 if path is not None: | |
70 return | |
71 | |
72 method_name = 'spec_for_{fullname}'.format(**locals()) | |
73 method = getattr(self, method_name, lambda: None) | |
74 return method() | |
75 | |
76 def spec_for_distutils(self): | |
77 import importlib.abc | |
78 import importlib.util | |
79 | |
80 class DistutilsLoader(importlib.abc.Loader): | |
81 | |
82 def create_module(self, spec): | |
83 return importlib.import_module('setuptools._distutils') | |
84 | |
85 def exec_module(self, module): | |
86 pass | |
87 | |
88 return importlib.util.spec_from_loader('distutils', DistutilsLoader()) | |
89 | |
90 def spec_for_pip(self): | |
91 """ | |
92 Ensure stdlib distutils when running under pip. | |
93 See pypa/pip#8761 for rationale. | |
94 """ | |
95 if self.pip_imported_during_build(): | |
96 return | |
97 clear_distutils() | |
98 self.spec_for_distutils = lambda: None | |
99 | |
100 @staticmethod | |
101 def pip_imported_during_build(): | |
102 """ | |
103 Detect if pip is being imported in a build script. Ref #2355. | |
104 """ | |
105 import traceback | |
106 return any( | |
107 frame.f_globals['__file__'].endswith('setup.py') | |
108 for frame, line in traceback.walk_stack(None) | |
109 ) | |
110 | |
111 | |
112 DISTUTILS_FINDER = DistutilsMetaFinder() | |
113 | |
114 | |
115 def add_shim(): | |
116 sys.meta_path.insert(0, DISTUTILS_FINDER) | |
117 | |
118 | |
119 def remove_shim(): | |
120 try: | |
121 sys.meta_path.remove(DISTUTILS_FINDER) | |
122 except ValueError: | |
123 pass |