{"id":"93c3b228477f5c24","repo":"pytest-dev/pytest","slug":"module-modname-r-has-version-verattr-r-re","errorCode":null,"errorMessage":"module {modname!r} has __version__ {verattr!r}, required is: {minversion!r}","messagePattern":"module (.+?) has __version__ (.+?), required is: (.+?)","errorType":"exception","errorClass":"Skipped","httpStatus":null,"severity":"warning","filePath":"src/_pytest/outcomes.py","lineNumber":282,"sourceCode":"            importlib.import_module(modname)\n        except exc_type as exc:\n            # Do not raise or issue warnings inside the catch_warnings() block.\n            if reason is None:\n                reason = f\"could not import {modname!r}: {exc}\"\n            skipped = Skipped(reason, allow_module_level=True)\n    if skipped:\n        raise skipped\n\n    mod = sys.modules[modname]\n    if minversion is None:\n        return mod\n    verattr = getattr(mod, \"__version__\", None)\n    if minversion is not None:\n        # Imported lazily to improve start-up time.\n        from packaging.version import Version\n\n        if verattr is None or Version(verattr) < Version(minversion):\n            raise Skipped(\n                f\"module {modname!r} has __version__ {verattr!r}, required is: {minversion!r}\",\n                allow_module_level=True,\n            )\n    return mod\n","sourceCodeStart":264,"sourceCodeEnd":287,"githubUrl":"https://github.com/pytest-dev/pytest/blob/98b357f69e380da908740a212288d73b2ee06687/src/_pytest/outcomes.py#L264-L287","documentation":"pytest.importorskip(modname, minversion=X) raises Skipped (a skip outcome) when the imported module's __version__ attribute is missing or older than minversion. This is a controlled skip, not a hard failure, so the test is reported as skipped with the version mismatch detail.","triggerScenarios":"pytest.importorskip('numpy', minversion='1.20') when numpy.__version__ is older than 1.20, or when the module exposes no __version__ attribute at all.","commonSituations":"Dependency version mismatches in CI matrices, modules that do not define __version__ (some C extensions or older libs), pinned outdated deps.","solutions":["Upgrade the dependency to a version meeting minversion","Lower the minversion argument to match what is installed","Ensure the module exposes a PEP 440-compliant __version__"],"exampleFix":"// before\nlib = pytest.importorskip('mymod', minversion='2.0')\n// after\nlib = pytest.importorskip('mymod', minversion='1.5')","handlingStrategy":"validation","validationCode":"def importorskip_version(modname, minversion):\n    import importlib, sys\n    from packaging.version import Version\n    mod = importlib.import_module(modname)\n    ver = getattr(mod, '__version__', None)\n    if ver is None or Version(ver) < Version(minversion):\n        import pytest; pytest.skip(f'{modname} {ver} < {minversion}')\n    return mod","typeGuard":"def module_satisfies(modname, minversion) -> bool:\n    import importlib\n    from packaging.version import Version\n    mod = importlib.import_module(modname)\n    ver = getattr(mod, '__version__', None)\n    return ver is not None and Version(ver) >= Version(minversion)","tryCatchPattern":null,"preventionTips":["Pin compatible dependency versions in CI so importorskip minversion matches installed versions","Ensure modules you gate on expose a PEP 440 __version__"],"tags":["outcomes","importorskip","version","pytest","skip"],"analyzedSha":"98b357f69e380da908740a212288d73b2ee06687","analyzedAt":"2026-08-04T20:26:34.442Z","schemaVersion":2}