python / python/cpython

pkgutil.walk_packages(None) imports tests and then their SkipTest exceptions ends iteration

Abierto
#131,684 6 comentarios 0 reacciones 0 asignados Ver en GitHub

Nadie ha tomado este issue todavía.

pending stdlib type-bug
Lenguaje dominante
Python
Estrellas
77.2k
Forks
35.9k
Métricas de merge de PR
Métricas de PR pendientes

Descripción

Bug report

I have to be clear that in some ways this isn't technically a bug per se, it's documented in the documentation, I just think the default behavior should be different because it's not ergonomic -- and that behavior change should be documented. It's a bug in the sense of I tried to do the simplest thing possible and Python was like "NOPE" and I was like "well that's gotta be a bug in Python," and I believe I am technically wrong but a lot of people in similar positions would assume the same.

Basic problem: Stdlib contains non-importable modules, if they fail with ImportError then pkgutil.walk_packages will ignore them, and those are the only packages it will ignore by default. But stdlib contains a bunch of non-importable test-case modules that instead fail with unittest.SkipTest. This means that any use of the default args on walk_packages() errors out, you have to manually tell it that SkipTest is a fine error to ignore.

Bug description:

Steps to Reproduce

Fire up python 3.13, then run the following two lines:

>>> import pkgutil
>>> [p.name for p in pkgutil.walk_packages()]
Traceback (most recent call last):
  File "<python-input-7>", line 1, in <module>
    [p.name for p in pkgutil.walk_packages()]
                     ~~~~~~~~~~~~~~~~~~~~~^^
  File "/opt/homebrew/Cellar/python@3.13/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/pkgutil.py", line 93, in walk_packages
    yield from walk_packages(path, info.name+'.', onerror)
  File "/opt/homebrew/Cellar/python@3.13/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/pkgutil.py", line 78, in walk_packages
    __import__(info.name)
    ~~~~~~~~~~^^^^^^^^^^^
  File "/opt/homebrew/Cellar/python@3.13/3.13.2/Frameworks/Python.framework/Versions/3.13/lib/python3.13/test/test_free_threading/__init__.py", line 8, in <module>
    raise unittest.SkipTest("GIL enabled")
unittest.case.SkipTest: GIL enabled

OR, fire up homebrew's (or poetry's) python 3.12, then run the same:

Python 3.12.9 (main, Feb  4 2025, 14:38:38) [Clang 16.0.0 (clang-1600.0.26.6)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pkgutil
>>> [p.name for p in pkgutil.walk_packages()]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/homebrew/Cellar/python@3.12/3.12.9/Frameworks/Python.framework/Versions/3.12/lib/python3.12/pkgutil.py", line 93, in walk_packages
    yield from walk_packages(path, info.name+'.', onerror)
  File "/opt/homebrew/Cellar/python@3.12/3.12.9/Frameworks/Python.framework/Versions/3.12/lib/python3.12/pkgutil.py", line 78, in walk_packages
    __import__(info.name)
  File "/opt/homebrew/Cellar/python@3.12/3.12.9/Frameworks/Python.framework/Versions/3.12/lib/python3.12/test/test_gdb/__init__.py", line 22, in <module>
    raise unittest.SkipTest("test_gdb only works on source builds at the moment.")
unittest.case.SkipTest: test_gdb only works on source builds at the moment.

Cause

Seems to be pretty obvious, these are test modules that exist all the time (whether GIL is enabled or not, whether debugger is enabled or not) but they raise an exception when they get imported.

Suggestions

pkgutil should be able to catch and discard unittest.SkipTest.

The easiest way to do this is to make unittest.SkipTest a subclass of ImportError instead of Exception, but that "smells risky" (in particular it presumably isn't only thrown when people import modules). The smarter way to do this is to just document that we by default don't error on SkipTest either and adjust the code at https://github.com/python/cpython/blob/v3.13.2/Lib/pkgutil.py#L82 accordingly.

CPython versions tested on:

3.11.11, 3.12.9, 3.13.2

Operating systems tested on:

macOS

Linked PRs
  • gh-148926

Guía de contribución

Abrir la guía de contribución

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Línea de trabajo

Empieza por Lib/pkgutil.py alrededor de la línea 82 y reproduce el fallo usando pkgutil.walk_packages() con los paquetes de prueba de Python descritos en el issue. Revisa el PR enlazado gh-148926 y la documentación y las pruebas relacionadas; el trabajo estará terminado cuando el comportamiento acordado de SkipTest esté implementado y documentado sin romper el manejo de errores existente.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
backend
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.