From 803c3cb271ead297c4fe3ca916b54ed05a623459 Mon Sep 17 00:00:00 2001 From: Ryan Clary Date: Wed, 15 Apr 2020 15:27:33 -0700 Subject: [PATCH] * Use an explicit environment for subprocess to ensure that existing environment variables are not inherited. This ensures more reliable results, see issue #1540. * Attempt to send SYSTEMROOT variable to Windows subprocess --- AUTHORS.txt | 1 + jedi/inference/compiled/subprocess/__init__.py | 12 +++++++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 41e72edf..d04cc48c 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -56,6 +56,7 @@ Code Contributors - Shane Steinert-Threlkeld (@shanest) - Tim Gates (@timgates42) - Lior Goldberg (@goldberglior) +- Ryan Clary (@mrclary) And a few more "anonymous" contributors. diff --git a/jedi/inference/compiled/subprocess/__init__.py b/jedi/inference/compiled/subprocess/__init__.py index 246cffa5..d921e1bd 100644 --- a/jedi/inference/compiled/subprocess/__init__.py +++ b/jedi/inference/compiled/subprocess/__init__.py @@ -181,6 +181,15 @@ class CompiledSubprocess(object): os.path.dirname(os.path.dirname(parso_path)), '.'.join(str(x) for x in sys.version_info[:3]), ) + # Use explicit envionment to ensure reliable results (#1540) + env = {} + if os.name == 'nt': + # if SYSTEMROOT (or case variant) exists in environment, + # ensure it goes to subprocess + for k, v in os.environ.items(): + if 'SYSTEMROOT' == k.upper(): + env.update({k: os.environ[k]}) + break # don't risk multiple entries process = GeneralizedPopen( args, stdin=subprocess.PIPE, @@ -188,7 +197,8 @@ class CompiledSubprocess(object): stderr=subprocess.PIPE, # Use system default buffering on Python 2 to improve performance # (this is already the case on Python 3). - bufsize=-1 + bufsize=-1, + env=env ) self._stderr_queue = Queue() self._stderr_thread = t = Thread(