Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
[3.11] gh-135374: Adjust test for setuptools' replacement of distutils (
GH-138796)

ensurepip installs a bundled copy of distutils, which overrides
the stdlib module. This affects several tests. This commit:

- skips distutils in test___all__, as we're unlikely to break
  `__all__` in a security-fix-only branch (and if we do it's not
  much of a a big deal)
- skips importability tests of distutils submodules if the
  setuptools hack is detected
(cherry picked from commit 987af36)

Co-authored-by: Petr Viktorin <encukou@gmail.com>
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
Co-authored-by: Emma Smith <emma@emmatyping.dev>
  • Loading branch information
3 people authored and miss-islington committed Sep 24, 2025
commit 7ef179f53cc6a673f7f9e1398ee0b600afdb89f8
6 changes: 6 additions & 0 deletions Lib/test/test___all__.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,12 @@ def check_all(self, modname):
self.assertEqual(keys, all_set, "in module {}".format(modname))

def walk_modules(self, basedir, modpath):
if modpath == 'distutils.':
# gh-135374: when setuptools is installed, it now replaces
# 'distutils' with its own version.
# In a security-fix only branch of CPython,
# skip the __all__ test rather than deal with the fallout.
return
for fn in sorted(os.listdir(basedir)):
path = os.path.join(basedir, fn)
if os.path.isdir(path):
Expand Down
34 changes: 27 additions & 7 deletions Lib/test/test_sundry.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import sys
from test import support
import unittest
import sys

class TestUntestedModules(unittest.TestCase):
def test_untested_modules_can_be_imported(self):
Expand All @@ -18,6 +19,32 @@ def test_untested_modules_can_be_imported(self):
self.fail('{} has tests even though test_sundry claims '
'otherwise'.format(name))

import html.entities

try:
import tty # Not available on Windows
except ImportError:
if support.verbose:
print("skipping tty")

def test_distutils_modules(self):
with warnings_helper.check_warnings(quiet=True):

path_copy = sys.path[:]
import distutils
if '_distutils_hack' in sys.modules:
# gh-135374: when 'setuptools' is installed, it now replaces
# 'distutils' with its own version.
# This imports '_distutils_hack' and modifies sys.path.
# The setuptols version of distutils also does not include some
# of the modules tested here.

# Undo the path modifications and skip the test.

sys.path[:] = path_copy
raise unittest.SkipTest(
'setuptools has replaced distutils with its own version')

import distutils.bcppcompiler
import distutils.ccompiler
import distutils.cygwinccompiler
Expand All @@ -44,13 +71,6 @@ def test_untested_modules_can_be_imported(self):
import distutils.command.sdist
import distutils.command.upload

import html.entities

try:
import tty # Not available on Windows
except ImportError:
if support.verbose:
print("skipping tty")


if __name__ == "__main__":
Expand Down
Loading