Skip to content

No module importlib.readers breaks pytest==7.0.0 with python 3.9 #9608

@kdelee

Description

@kdelee

My project is using python 3.9 and we hit this today when 7.0.0 released:

if sys.version_info >= (3, 9):
def get_resource_reader(self, name: str) -> importlib.abc.TraversableResources: # type: ignore
from types import SimpleNamespace
from importlib.readers import FileReader

Because this import does not seem to be working/reference existing code

/var/lib/awx/venv/awx/lib64/python3.9/site-packages/_pytest/assertion/rewrite.py:283: in get_resource_reader
    from importlib.readers import FileReader
E   ModuleNotFoundError: No module named 'importlib.readers'

If you'd like to see where this is happening on our CI, I'm pretty sure you can see the logs for the api-test stage here https://github.com/ansible/awx/runs/5072172116?check_suite_focus=true

Downgrading pytest fixes the issue, so it seems to a problem exclusively in 7.0.0 right now.

  • a detailed description of the bug or problem you are having
  • output of pip list from the virtual environment you are using piplist.txt
  • pytest==7.0.0
  • CentOS Stream release 9
  • minimal example if possible

This minimal reproducer re-creates the error:
say we have broken.py with the following contents

from pip._internal.req import parse_requirements


def test_broken():
    assert True

then running pytest broken.py results in

==================================================================================== test session starts =====================================================================================
platform linux -- Python 3.9.10, pytest-7.0.0, pluggy-1.0.0
django: settings: awx.settings.development (from ini)
rootdir: /awx_devel, configfile: pytest.ini
plugins: mock-1.11.1, forked-1.4.0, django-4.5.2, xdist-1.34.0, cov-3.0.0, timeout-2.1.0
collected 0 items / 1 error                                                                                                                                                                  

=========================================================================================== ERRORS ===========================================================================================
_________________________________________________________________________________ ERROR collecting broken.py _________________________________________________________________________________
ImportError while importing test module '/awx_devel/broken.py'.
Hint: make sure your test modules/packages have valid Python names.
Traceback:
/usr/lib64/python3.9/importlib/__init__.py:127: in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
broken.py:1: in <module>
    from pip._internal.req import parse_requirements
/var/lib/awx/venv/awx/lib64/python3.9/site-packages/pip/_internal/req/__init__.py:5: in <module>
    from pip._internal.utils.logging import indent_log
/var/lib/awx/venv/awx/lib64/python3.9/site-packages/pip/_internal/utils/logging.py:23: in <module>
    from pip._internal.exceptions import DiagnosticPipError
/var/lib/awx/venv/awx/lib64/python3.9/site-packages/pip/_internal/exceptions.py:13: in <module>
    from pip._vendor.requests.models import Request, Response
/var/lib/awx/venv/awx/lib64/python3.9/site-packages/pip/_vendor/requests/__init__.py:135: in <module>
    from . import utils
/var/lib/awx/venv/awx/lib64/python3.9/site-packages/pip/_vendor/requests/utils.py:42: in <module>
    DEFAULT_CA_BUNDLE_PATH = certs.where()
/var/lib/awx/venv/awx/lib64/python3.9/site-packages/pip/_vendor/certifi/core.py:50: in where
    _CACERT_CTX = get_path("pip._vendor.certifi", "cacert.pem")
/usr/lib64/python3.9/importlib/resources.py:161: in path
    reader = _get_resource_reader(_get_package(package))
/usr/lib64/python3.9/importlib/resources.py:76: in _get_resource_reader
    spec.loader.get_resource_reader(spec.name))
E   ModuleNotFoundError: No module named 'importlib.readers'
================================================================================== short test summary info ===================================================================================
ERROR broken.py
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 1 error during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
================================================================================ 5 warnings, 1 error in 1.15s ================================================================================

Metadata

Metadata

Assignees

No one assigned

    Labels

    type: bugproblem that needs to be addressedtype: regressionindicates a problem that was introduced in a release which was working previously

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions