summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorSteve Dower <steve.dower@python.org>2022-10-14 15:58:54 (GMT)
committerGitHub <noreply@github.com>2022-10-14 15:58:54 (GMT)
commit2fe44f728afa2dd506c304641f0481d6813d1dbd (patch)
tree9d0bd27e55b44fb99d57657881a0abd110e2cab9 /Lib
parentb863b9cd4b8681cf5fff5f121837a1039045783f (diff)
downloadcpython-2fe44f728afa2dd506c304641f0481d6813d1dbd.zip
cpython-2fe44f728afa2dd506c304641f0481d6813d1dbd.tar.gz
cpython-2fe44f728afa2dd506c304641f0481d6813d1dbd.tar.bz2
gh-98251: Allow venv to pass along PYTHON* variables to pip and ensurepip when they do not impact path resolution (GH-98259)
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_venv.py8
-rw-r--r--Lib/venv/__init__.py28
2 files changed, 23 insertions, 13 deletions
diff --git a/Lib/test/test_venv.py b/Lib/test/test_venv.py
index 4359a4e..b355b00 100644
--- a/Lib/test/test_venv.py
+++ b/Lib/test/test_venv.py
@@ -216,7 +216,7 @@ class BasicTest(BaseTest):
if sys.platform == 'win32':
expect_exe = os.path.normcase(os.path.realpath(expect_exe))
- def pip_cmd_checker(cmd):
+ def pip_cmd_checker(cmd, **kwargs):
cmd[0] = os.path.normcase(cmd[0])
self.assertEqual(
cmd,
@@ -232,7 +232,7 @@ class BasicTest(BaseTest):
)
fake_context = builder.ensure_directories(fake_env_dir)
- with patch('venv.subprocess.check_call', pip_cmd_checker):
+ with patch('venv.subprocess.check_output', pip_cmd_checker):
builder.upgrade_dependencies(fake_context)
@requireVenvCreate
@@ -659,8 +659,8 @@ class EnsurePipTest(BaseTest):
try:
yield
except subprocess.CalledProcessError as exc:
- out = exc.output.decode(errors="replace")
- err = exc.stderr.decode(errors="replace")
+ out = (exc.output or b'').decode(errors="replace")
+ err = (exc.stderr or b'').decode(errors="replace")
self.fail(
f"{exc}\n\n"
f"**Subprocess Output**\n{out}\n\n"
diff --git a/Lib/venv/__init__.py b/Lib/venv/__init__.py
index 034e3d4..5e695c7 100644
--- a/Lib/venv/__init__.py
+++ b/Lib/venv/__init__.py
@@ -339,14 +339,25 @@ class EnvBuilder:
shutil.copyfile(src, dst)
break
+ def _call_new_python(self, context, *py_args, **kwargs):
+ """Executes the newly created Python using safe-ish options"""
+ # gh-98251: We do not want to just use '-I' because that masks
+ # legitimate user preferences (such as not writing bytecode). All we
+ # really need is to ensure that the path variables do not overrule
+ # normal venv handling.
+ args = [context.env_exec_cmd, *py_args]
+ kwargs['env'] = env = os.environ.copy()
+ env['VIRTUAL_ENV'] = context.env_dir
+ env.pop('PYTHONHOME', None)
+ env.pop('PYTHONPATH', None)
+ kwargs['cwd'] = context.env_dir
+ kwargs['executable'] = context.env_exec_cmd
+ subprocess.check_output(args, **kwargs)
+
def _setup_pip(self, context):
"""Installs or upgrades pip in a virtual environment"""
- # We run ensurepip in isolated mode to avoid side effects from
- # environment vars, the current directory and anything else
- # intended for the global Python environment
- cmd = [context.env_exec_cmd, '-Im', 'ensurepip', '--upgrade',
- '--default-pip']
- subprocess.check_output(cmd, stderr=subprocess.STDOUT)
+ self._call_new_python(context, '-m', 'ensurepip', '--upgrade',
+ '--default-pip', stderr=subprocess.STDOUT)
def setup_scripts(self, context):
"""
@@ -445,9 +456,8 @@ class EnvBuilder:
logger.debug(
f'Upgrading {CORE_VENV_DEPS} packages in {context.bin_path}'
)
- cmd = [context.env_exec_cmd, '-m', 'pip', 'install', '--upgrade']
- cmd.extend(CORE_VENV_DEPS)
- subprocess.check_call(cmd)
+ self._call_new_python(context, '-m', 'pip', 'install', '--upgrade',
+ *CORE_VENV_DEPS)
def create(env_dir, system_site_packages=False, clear=False,