Fixes #24875: pip can now be installed in a venv with --system-site-packages.
This commit is contained in:
parent
a5917d1d15
commit
db6322cb8a
|
@ -328,13 +328,7 @@ class EnsurePipTest(BaseTest):
|
||||||
with open(os.devnull, "rb") as f:
|
with open(os.devnull, "rb") as f:
|
||||||
self.assertEqual(f.read(), b"")
|
self.assertEqual(f.read(), b"")
|
||||||
|
|
||||||
# Requesting pip fails without SSL (http://bugs.python.org/issue19744)
|
def do_test_with_pip(self, system_site_packages):
|
||||||
@unittest.skipIf(ssl is None, ensurepip._MISSING_SSL_MESSAGE)
|
|
||||||
@unittest.skipUnless(threading, 'some dependencies of pip import threading'
|
|
||||||
' module unconditionally')
|
|
||||||
# Issue #26610: pip/pep425tags.py requires ctypes
|
|
||||||
@unittest.skipUnless(ctypes, 'pip requires ctypes')
|
|
||||||
def test_with_pip(self):
|
|
||||||
rmtree(self.env_dir)
|
rmtree(self.env_dir)
|
||||||
with EnvironmentVarGuard() as envvars:
|
with EnvironmentVarGuard() as envvars:
|
||||||
# pip's cross-version compatibility may trigger deprecation
|
# pip's cross-version compatibility may trigger deprecation
|
||||||
|
@ -368,6 +362,7 @@ class EnsurePipTest(BaseTest):
|
||||||
# config in place to ensure we ignore it
|
# config in place to ensure we ignore it
|
||||||
try:
|
try:
|
||||||
self.run_with_capture(venv.create, self.env_dir,
|
self.run_with_capture(venv.create, self.env_dir,
|
||||||
|
system_site_packages=system_site_packages,
|
||||||
with_pip=True)
|
with_pip=True)
|
||||||
except subprocess.CalledProcessError as exc:
|
except subprocess.CalledProcessError as exc:
|
||||||
# The output this produces can be a little hard to read,
|
# The output this produces can be a little hard to read,
|
||||||
|
@ -417,9 +412,21 @@ class EnsurePipTest(BaseTest):
|
||||||
out = out.decode("latin-1") # Force to text, prevent decoding errors
|
out = out.decode("latin-1") # Force to text, prevent decoding errors
|
||||||
self.assertIn("Successfully uninstalled pip", out)
|
self.assertIn("Successfully uninstalled pip", out)
|
||||||
self.assertIn("Successfully uninstalled setuptools", out)
|
self.assertIn("Successfully uninstalled setuptools", out)
|
||||||
# Check pip is now gone from the virtual environment
|
# Check pip is now gone from the virtual environment. This only
|
||||||
self.assert_pip_not_installed()
|
# applies in the system_site_packages=False case, because in the
|
||||||
|
# other case, pip may still be available in the system site-packages
|
||||||
|
if not system_site_packages:
|
||||||
|
self.assert_pip_not_installed()
|
||||||
|
|
||||||
|
# Requesting pip fails without SSL (http://bugs.python.org/issue19744)
|
||||||
|
@unittest.skipIf(ssl is None, ensurepip._MISSING_SSL_MESSAGE)
|
||||||
|
@unittest.skipUnless(threading, 'some dependencies of pip import threading'
|
||||||
|
' module unconditionally')
|
||||||
|
# Issue #26610: pip/pep425tags.py requires ctypes
|
||||||
|
@unittest.skipUnless(ctypes, 'pip requires ctypes')
|
||||||
|
def test_with_pip(self):
|
||||||
|
self.do_test_with_pip(False)
|
||||||
|
self.do_test_with_pip(True)
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
|
@ -77,6 +77,10 @@ class EnvBuilder:
|
||||||
"""
|
"""
|
||||||
env_dir = os.path.abspath(env_dir)
|
env_dir = os.path.abspath(env_dir)
|
||||||
context = self.ensure_directories(env_dir)
|
context = self.ensure_directories(env_dir)
|
||||||
|
# See issue 24875. We need system_site_packages to be False
|
||||||
|
# until after pip is installed.
|
||||||
|
true_system_site_packages = self.system_site_packages
|
||||||
|
self.system_site_packages = False
|
||||||
self.create_configuration(context)
|
self.create_configuration(context)
|
||||||
self.setup_python(context)
|
self.setup_python(context)
|
||||||
if self.with_pip:
|
if self.with_pip:
|
||||||
|
@ -84,6 +88,11 @@ class EnvBuilder:
|
||||||
if not self.upgrade:
|
if not self.upgrade:
|
||||||
self.setup_scripts(context)
|
self.setup_scripts(context)
|
||||||
self.post_setup(context)
|
self.post_setup(context)
|
||||||
|
if true_system_site_packages:
|
||||||
|
# We had set it to False before, now
|
||||||
|
# restore it and rewrite the configuration
|
||||||
|
self.system_site_packages = True
|
||||||
|
self.create_configuration(context)
|
||||||
|
|
||||||
def clear_directory(self, path):
|
def clear_directory(self, path):
|
||||||
for fn in os.listdir(path):
|
for fn in os.listdir(path):
|
||||||
|
|
Loading…
Reference in New Issue