Describe the issue:
In the recent release Python 3.11.14 (Oct 9 2025), the version of setuptools is upgraded. (see python/cpython#135396 )
Due to this change, CI tests running on Python 3.11 is currently failing.
Example: https://github.com/numpy/numpy/actions/runs/18397458439/job/52421553249
According to the documentation ( https://numpy.org/devdocs/reference/distutils_status_migration.html#numpy-setuptools-interaction ) , there seem to be two possible solutions:
In my opinion, option 1 seems more appropriate in the long term, but I will follow
the maintainers’ suggestion.
Reproduce the code example:
spin test -- numpy/tests/test_public_api.py::test_api_importable
Error message:
_______________________________________________________________________________ test_api_importable ________________________________________________________________________________
def test_api_importable():
"""
Check that all submodules listed higher up in this file can be imported
Note that if a PRIVATE_BUT_PRESENT_MODULES entry goes missing, it may
simply need to be removed from the list (deprecation may or may not be
needed - apply common sense).
"""
def check_importable(module_name):
try:
importlib.import_module(module_name)
except (ImportError, AttributeError):
return False
return True
module_names = []
for module_name in PUBLIC_MODULES:
if not check_importable(module_name):
module_names.append(module_name)
if module_names:
raise AssertionError("Modules in the public API that cannot be "
f"imported: {module_names}")
for module_name in PUBLIC_ALIASED_MODULES:
try:
eval(module_name)
except AttributeError:
module_names.append(module_name)
if module_names:
raise AssertionError("Modules in the public API that were not "
f"found: {module_names}")
with warnings.catch_warnings(record=True) as w:
warnings.filterwarnings('always', category=DeprecationWarning)
warnings.filterwarnings('always', category=ImportWarning)
for module_name in PRIVATE_BUT_PRESENT_MODULES:
if not check_importable(module_name):
module_names.append(module_name)
if module_names:
> raise AssertionError("Modules that are not really public but looked "
"public and can not be imported: "
f"{module_names}")
E AssertionError: Modules that are not really public but looked public and can not be imported: ['numpy.distutils.msvccompiler']
check_importable = <function test_api_importable.<locals>.check_importable at 0x7cd42da947c0>
module_name = 'numpy.distutils.unixccompiler'
module_names = ['numpy.distutils.msvccompiler']
w = [<warnings.WarningMessage object at 0x7cd42bf88310>, <warnings.WarningMessage object at 0x7cd42bf8a210>, <warnings.WarningMessage object at 0x7cd42bfa8fd0>, <warnings.WarningMessage object at 0x7cd42bfa9010>]
numpy/tests/test_public_api.py:423: AssertionError
============================================================================= short test summary info ==============================================================================
FAILED numpy/tests/test_public_api.py::test_api_importable - AssertionError: Modules that are not really public but looked public and can not be imported: ['numpy.distutils.msvccompiler']
================================================================================ 1 failed in 0.24s =================================================================================
Python and NumPy Versions:
2.4.0.dev0+git20251010.d2678ee
3.11.14 (main, Oct 10 2025, 16:47:51) [GCC 11.4.0]
Runtime Environment:
No response
Context for the issue:
No response
Describe the issue:
In the recent release Python 3.11.14 (Oct 9 2025), the version of setuptools is upgraded. (see python/cpython#135396 )
Due to this change, CI tests running on Python 3.11 is currently failing.
Example: https://github.com/numpy/numpy/actions/runs/18397458439/job/52421553249
According to the documentation ( https://numpy.org/devdocs/reference/distutils_status_migration.html#numpy-setuptools-interaction ) , there seem to be two possible solutions:
1: Completely erase
numpy.distutilsSo, this seems to be a good time to remove it completely.
2: set
setuptools<60.0when running CI tests on Python 3.11numpy.distutilsand recentsetuptoolsversions.In my opinion, option 1 seems more appropriate in the long term, but I will follow
the maintainers’ suggestion.
Reproduce the code example:
Error message:
_______________________________________________________________________________ test_api_importable ________________________________________________________________________________ def test_api_importable(): """ Check that all submodules listed higher up in this file can be imported Note that if a PRIVATE_BUT_PRESENT_MODULES entry goes missing, it may simply need to be removed from the list (deprecation may or may not be needed - apply common sense). """ def check_importable(module_name): try: importlib.import_module(module_name) except (ImportError, AttributeError): return False return True module_names = [] for module_name in PUBLIC_MODULES: if not check_importable(module_name): module_names.append(module_name) if module_names: raise AssertionError("Modules in the public API that cannot be " f"imported: {module_names}") for module_name in PUBLIC_ALIASED_MODULES: try: eval(module_name) except AttributeError: module_names.append(module_name) if module_names: raise AssertionError("Modules in the public API that were not " f"found: {module_names}") with warnings.catch_warnings(record=True) as w: warnings.filterwarnings('always', category=DeprecationWarning) warnings.filterwarnings('always', category=ImportWarning) for module_name in PRIVATE_BUT_PRESENT_MODULES: if not check_importable(module_name): module_names.append(module_name) if module_names: > raise AssertionError("Modules that are not really public but looked " "public and can not be imported: " f"{module_names}") E AssertionError: Modules that are not really public but looked public and can not be imported: ['numpy.distutils.msvccompiler'] check_importable = <function test_api_importable.<locals>.check_importable at 0x7cd42da947c0> module_name = 'numpy.distutils.unixccompiler' module_names = ['numpy.distutils.msvccompiler'] w = [<warnings.WarningMessage object at 0x7cd42bf88310>, <warnings.WarningMessage object at 0x7cd42bf8a210>, <warnings.WarningMessage object at 0x7cd42bfa8fd0>, <warnings.WarningMessage object at 0x7cd42bfa9010>] numpy/tests/test_public_api.py:423: AssertionError ============================================================================= short test summary info ============================================================================== FAILED numpy/tests/test_public_api.py::test_api_importable - AssertionError: Modules that are not really public but looked public and can not be imported: ['numpy.distutils.msvccompiler'] ================================================================================ 1 failed in 0.24s =================================================================================Python and NumPy Versions:
2.4.0.dev0+git20251010.d2678ee
3.11.14 (main, Oct 10 2025, 16:47:51) [GCC 11.4.0]
Runtime Environment:
No response
Context for the issue:
No response