diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py index 1cebf6b24a6..868f2798394 100644 --- a/Lib/test/test_subprocess.py +++ b/Lib/test/test_subprocess.py @@ -682,7 +682,6 @@ class ProcessTestCase(BaseTestCase): # on adding even when the environment in exec is empty. # Gentoo sandboxes also force LD_PRELOAD and SANDBOX_* to exist. return ('VERSIONER' in n or '__CF' in n or # MacOS - '__PYVENV_LAUNCHER__' in n or # MacOS framework build n == 'LD_PRELOAD' or n.startswith('SANDBOX') or # Gentoo n == 'LC_CTYPE') # Locale coercion triggered diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py index a3b78c4e44e..b2794cd992a 100644 --- a/Lib/test/test_venv.py +++ b/Lib/test/test_venv.py @@ -391,6 +391,18 @@ class BasicTest(BaseTest): self.assertEqual(err, "".encode()) + @unittest.skipUnless(sys.platform == 'darwin', 'only relevant on macOS') + def test_macos_env(self): + rmtree(self.env_dir) + builder = venv.EnvBuilder() + builder.create(self.env_dir) + + envpy = os.path.join(os.path.realpath(self.env_dir), + self.bindir, self.exe) + out, err = check_output([envpy, '-c', + 'import os; print("__PYVENV_LAUNCHER__" in os.environ)']) + self.assertEqual(out.strip(), 'False'.encode()) + @requireVenvCreate class EnsurePipTest(BaseTest): """Test venv module installation of pip.""" diff --git a/Mac/Tools/pythonw.c b/Mac/Tools/pythonw.c index 1d2db383f94..c8bd3ba8d68 100644 --- a/Mac/Tools/pythonw.c +++ b/Mac/Tools/pythonw.c @@ -196,6 +196,15 @@ main(int argc, char **argv) { } } + /* + * The environment variable is used to pass the value of real_path + * to the actual python interpreter, and is read by code in + * Python/coreconfig.c. + * + * This way the real interpreter knows how the user invoked the + * interpreter and can behave as if this launcher is the real + * interpreter (looking for pyvenv configuration, ...) + */ setenv("__PYVENV_LAUNCHER__", real_path, 1); } diff --git a/Misc/NEWS.d/next/Core and Builtins/2018-09-23-16-32-58.bpo-22490.8e0YDf.rst b/Misc/NEWS.d/next/Core and Builtins/2018-09-23-16-32-58.bpo-22490.8e0YDf.rst new file mode 100644 index 00000000000..a281f024249 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2018-09-23-16-32-58.bpo-22490.8e0YDf.rst @@ -0,0 +1,2 @@ +Don't leak environment variable ``__PYVENV_LAUNCHER__`` into the interpreter +session on macOS. diff --git a/Python/initconfig.c b/Python/initconfig.c index 19070d2a3fa..7bad36ef17b 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1139,6 +1139,17 @@ config_init_program_name(PyConfig *config) if (_PyStatus_EXCEPTION(status)) { return status; } + + /* + * This environment variable is used to communicate between + * the stub launcher and the real interpreter and isn't needed + * beyond this point. + * + * Clean up to avoid problems when launching other programs + * later on. + */ + (void)unsetenv("__PYVENV_LAUNCHER__"); + return _PyStatus_OK(); } }