opendatalab/MinerU · error · AttributeError

module {__name__!r} has no attribute {name!r}

Error message

module {__name__!r} has no attribute {name!r}

What it means

AttributeError raised by the lazy-import __getattr__ in mineru.data.data_reader_writer: the requested attribute is not one of the lazily exported names (e.g. MultiBucketS3DataWriter, S3DataReader, S3DataWriter). The module defers heavy imports; anything outside the known lazy export set falls through to this error.

Source

Thrown at mineru/data/data_reader_writer/__init__.py:38

    """按需加载 S3 DataReader/DataWriter,避免默认安装场景强制依赖 boto3。"""
    if name in {"MultiBucketS3DataReader", "MultiBucketS3DataWriter"}:
        from .multi_bucket_s3 import MultiBucketS3DataReader, MultiBucketS3DataWriter

        s3_exports = {
            "MultiBucketS3DataReader": MultiBucketS3DataReader,
            "MultiBucketS3DataWriter": MultiBucketS3DataWriter,
        }
        globals().update(s3_exports)
        return s3_exports[name]

    if name in {"S3DataReader", "S3DataWriter"}:
        from .s3 import S3DataReader, S3DataWriter

        s3_exports = {"S3DataReader": S3DataReader, "S3DataWriter": S3DataWriter}
        globals().update(s3_exports)
        return s3_exports[name]

    raise AttributeError(f"module {__name__!r} has no attribute {name!r}")

View on GitHub (pinned to 4fe4bde114)

Solutions

  1. Check the package __init__ / dir(mineru.data.data_reader_writer) for the actual exported names
  2. Use the correct current class name (e.g. S3DataReader/S3DataWriter for S3, or import the defining submodule directly)
  3. Pin or upgrade to the MinerU version whose API your code targets
  4. For S3 classes, ensure optional S3 dependencies are installed so their imports succeed

Example fix

# before
from mineru.data.data_reader_writer import S3Reader  # AttributeError

# after
from mineru.data.data_reader_writer import S3DataReader
Defensive patterns

Strategy: type-guard

Validate before calling

import mineru.data.data_reader_writer as drw

name = 'S3DataReader'
if not hasattr(drw, name):
    raise ImportError(f'{name} not available in this MinerU version')
Klass = getattr(drw, name)

Type guard

from mineru.data.data_reader_writer import S3DataReader, S3DataWriter

KNOWN = {'S3DataReader', 'S3DataWriter', 'MultiBucketS3DataWriter'}

def reader_class_exists(name: str) -> bool:
    import mineru.data.data_reader_writer as drw
    return name in KNOWN and hasattr(drw, name)

Try / catch

try:
    from mineru.data.data_reader_writer import S3DataReader
except ImportError as exc:
    raise ImportError('Install MinerU S3 extras (boto3) or fix the class name') from exc

Prevention

When it happens

Trigger: from mineru.data.data_reader_writer import SomeName where SomeName is not defined in the package's __init__ lazy export table; also getattr(mineru.data.data_reader_writer, 'typo') style access; common with renamed or removed reader/writer classes across MinerU versions.

Common situations: Upgrading MinerU and using a class name that moved or was removed (e.g. old reader/writer names); IDE autocompleting a stale name; copy-pasted code from older docs.

Related errors


AI-assisted analysis of opendatalab/MinerU@4fe4bde114 (2026-08-14). Data as JSON: /api/errors/9186fb0bf24b59c8. Report an issue: GitHub.