diff options
| -rw-r--r-- | distutils/_msvccompiler.py | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/distutils/_msvccompiler.py b/distutils/_msvccompiler.py index 2d56ee0a..f7efd4eb 100644 --- a/distutils/_msvccompiler.py +++ b/distutils/_msvccompiler.py @@ -16,6 +16,7 @@ for older versions in distutils.msvc9compiler and distutils.msvccompiler. import os import subprocess import contextlib +import unittest.mock with contextlib.suppress(ImportError): import winreg @@ -504,7 +505,27 @@ class MSVCCompiler(CCompiler) : def spawn(self, cmd): env = dict(os.environ, PATH=self._paths) - return super().spawn(cmd, env=env) + with self._fallback_spawn(cmd, env) as fallback: + return super().spawn(cmd, env=env) + return fallback.value + + @contextlib.contextmanager + def _fallback_spawn(self, cmd, env): + """ + Discovered in pypa/distutils#15, some tools monkeypatch the compiler, + so the 'env' kwarg causes a TypeError. Detect this condition and + restore the legacy, unsafe behavior. + """ + bag = type('Bag', (), {})() + try: + yield bag + except TypeError as exc: + if "unexpected keyword argument 'env'" not in str(exc): + raise + else: + return + with unittest.mock.patch('os.environ', env): + bag.value = super().spawn(cmd) # -- Miscellaneous methods ----------------------------------------- # These are all used by the 'gen_lib_options() function, in |
