diff options
author | Steve Dower <steve.dower@microsoft.com> | 2016-06-17 16:32:38 (GMT) |
---|---|---|
committer | Steve Dower <steve.dower@microsoft.com> | 2016-06-17 16:32:38 (GMT) |
commit | 08bb8a41cc976343795bd0e241cd7388e9f44ad5 (patch) | |
tree | bfd17699100182e075d740b7f87fe2fa59f68a12 /Lib/distutils | |
parent | 85e6635edf4c56064fddd09f5350936dcd650389 (diff) | |
download | cpython-08bb8a41cc976343795bd0e241cd7388e9f44ad5.zip cpython-08bb8a41cc976343795bd0e241cd7388e9f44ad5.tar.gz cpython-08bb8a41cc976343795bd0e241cd7388e9f44ad5.tar.bz2 |
Issue #27048: Prevents distutils failing on Windows when environment variables contain non-ASCII characters
Diffstat (limited to 'Lib/distutils')
-rw-r--r-- | Lib/distutils/_msvccompiler.py | 6 | ||||
-rw-r--r-- | Lib/distutils/tests/test_msvccompiler.py | 18 |
2 files changed, 20 insertions, 4 deletions
diff --git a/Lib/distutils/_msvccompiler.py b/Lib/distutils/_msvccompiler.py index d0ba7d6..b120273 100644 --- a/Lib/distutils/_msvccompiler.py +++ b/Lib/distutils/_msvccompiler.py @@ -86,11 +86,9 @@ def _get_vc_env(plat_spec): try: out = subprocess.check_output( - '"{}" {} && set'.format(vcvarsall, plat_spec), - shell=True, + 'cmd /u /c "{}" {} && set'.format(vcvarsall, plat_spec), stderr=subprocess.STDOUT, - universal_newlines=True, - ) + ).decode('utf-16le', errors='replace') except subprocess.CalledProcessError as exc: log.error(exc.output) raise DistutilsPlatformError("Error executing {}" diff --git a/Lib/distutils/tests/test_msvccompiler.py b/Lib/distutils/tests/test_msvccompiler.py index c4d911f..4dc2488 100644 --- a/Lib/distutils/tests/test_msvccompiler.py +++ b/Lib/distutils/tests/test_msvccompiler.py @@ -83,6 +83,24 @@ class msvccompilerTestCase(support.TempdirManager, self.assertFalse(os.path.isfile(os.path.join( tempdir, os.path.basename(dll)))) + def test_get_vc_env_unicode(self): + import distutils._msvccompiler as _msvccompiler + + test_var = 'ṰḖṤṪ┅ṼẨṜ' + test_value = '₃⁴₅' + + # Ensure we don't early exit from _get_vc_env + old_distutils_use_sdk = os.environ.pop('DISTUTILS_USE_SDK', None) + os.environ[test_var] = test_value + try: + env = _msvccompiler._get_vc_env('x86') + self.assertIn(test_var.lower(), env) + self.assertEqual(test_value, env[test_var.lower()]) + finally: + os.environ.pop(test_var) + if old_distutils_use_sdk: + os.environ['DISTUTILS_USE_SDK'] = old_distutils_use_sdk + def test_suite(): return unittest.makeSuite(msvccompilerTestCase) |