diff --git a/src/pip/_internal/build_env.py b/src/pip/_internal/build_env.py index 1989c8aad05..04e1861ebb0 100644 --- a/src/pip/_internal/build_env.py +++ b/src/pip/_internal/build_env.py @@ -24,6 +24,7 @@ def __enter__(self): self.save_path = os.environ.get('PATH', None) self.save_pythonpath = os.environ.get('PYTHONPATH', None) + self.save_nousersite = os.environ.get('PYTHONNOUSERSITE', None) install_scheme = 'nt' if (os.name == 'nt') else 'posix_prefix' install_dirs = get_paths(install_scheme, vars={ @@ -48,20 +49,23 @@ def __enter__(self): else: os.environ['PYTHONPATH'] = lib_dirs + os.environ['PYTHONNOUSERSITE'] = '1' + return self.path def __exit__(self, exc_type, exc_val, exc_tb): if not self._no_clean: self._temp_dir.cleanup() - if self.save_path is None: - os.environ.pop('PATH', None) - else: - os.environ['PATH'] = self.save_path - if self.save_pythonpath is None: - os.environ.pop('PYTHONPATH', None) - else: - os.environ['PYTHONPATH'] = self.save_pythonpath + def restore_var(varname, old_value): + if old_value is None: + os.environ.pop(varname, None) + else: + os.environ[varname] = old_value + + restore_var('PATH', self.save_path) + restore_var('PYTHONPATH', self.save_pythonpath) + restore_var('PYTHONNOUSERSITE', self.save_nousersite) def cleanup(self): self._temp_dir.cleanup() diff --git a/src/pip/_internal/wheel.py b/src/pip/_internal/wheel.py index 17d52911698..7118558a56b 100644 --- a/src/pip/_internal/wheel.py +++ b/src/pip/_internal/wheel.py @@ -625,14 +625,11 @@ def _build_one(self, req, output_dir, python_tag=None): # Install build deps into temporary directory (PEP 518) with req.build_env: return self._build_one_inside_env(req, output_dir, - python_tag=python_tag, - isolate=True) + python_tag=python_tag) - def _build_one_inside_env(self, req, output_dir, python_tag=None, - isolate=False): + def _build_one_inside_env(self, req, output_dir, python_tag=None): with TempDirectory(kind="wheel") as temp_dir: - if self.__build_one(req, temp_dir.path, python_tag=python_tag, - isolate=isolate): + if self.__build_one(req, temp_dir.path, python_tag=python_tag): try: wheel_name = os.listdir(temp_dir.path)[0] wheel_path = os.path.join(output_dir, wheel_name) @@ -647,20 +644,18 @@ def _build_one_inside_env(self, req, output_dir, python_tag=None, self._clean_one(req) return None - def _base_setup_args(self, req, isolate=False): - flags = '-u' - # The -S flag currently breaks Python in virtualenvs, because it relies - # on site.py to find parts of the standard library outside the env. So - # isolation is disabled for now. - # if isolate: - # flags += 'S' + def _base_setup_args(self, req): + # NOTE: Eventually, we'd want to also -S to the flags here, when we're + # isolating. Currently, it breaks Python in virtualenvs, because it + # relies on site.py to find parts of the standard library outside the + # virtualenv. return [ - sys.executable, flags, '-c', + sys.executable, '-u', '-c', SETUPTOOLS_SHIM % req.setup_py ] + list(self.global_options) - def __build_one(self, req, tempd, python_tag=None, isolate=False): - base_args = self._base_setup_args(req, isolate=isolate) + def __build_one(self, req, tempd, python_tag=None): + base_args = self._base_setup_args(req) spin_message = 'Running setup.py bdist_wheel for %s' % (req.name,) with open_spinner(spin_message) as spinner: @@ -671,13 +666,8 @@ def __build_one(self, req, tempd, python_tag=None, isolate=False): if python_tag is not None: wheel_args += ["--python-tag", python_tag] - env = {} - if isolate: - env['PYTHONNOUSERSITE'] = '1' - try: call_subprocess(wheel_args, cwd=req.setup_py_dir, - extra_environ=env, show_stdout=False, spinner=spinner) return True except: