python-poetry/poetry · error · PackageNotFoundError

Package {name} ({version}) not found.

Error message

Package {name} ({version}) not found.

What it means

Raised by the base Repository.package when no in-memory package matches both the canonical name and exact version (repository.py:108-114). This is the generic lookup miss for repositories that hold a fixed set of packages (e.g. LockedRepository or an in-memory/test repository), not for remote HTTP repositories.

Source

Thrown at src/poetry/repositories/repository.py:114

        ]

    def _log(self, msg: str, level: str = "info") -> None:
        logger = logging.getLogger(f"{__name__}.{self.__class__.__name__}")
        getattr(logger, level)(f"<c1>Source ({self.name}):</c1> {msg}")

    def __len__(self) -> int:
        return len(self._packages)

    def find_links_for_package(self, package: Package) -> list[Link]:
        return []

    def package(self, name: str, version: Version) -> Package:
        canonicalized_name = canonicalize_name(name)
        for package in self.packages:
            if canonicalized_name == package.name and package.version == version:
                return package

        raise PackageNotFoundError(f"Package {name} ({version}) not found.")

    def log_age_filtered_versions(self, *, level: str, reset: bool) -> None:
        """Log package versions that were ignored due to solver.min-release-age.

        Must be overridden in Repository classes that support filtering by release age.

        Args:
            level: The log level to use (e.g. "info", "warning").
            reset: If True, clear the recorded filtered versions after logging.
        """

View on GitHub (pinned to 92b74dcfe3)

Solutions

  1. Refresh the lock with `poetry lock --no-update` or `poetry lock`.
  2. Confirm the package/version is actually in repository.packages before calling .package().
  3. If using a custom Repository, ensure it is populated with the packages you query.
Defensive patterns

Strategy: validation

Validate before calling

from poetry.core.constraints.version import Version
target = (canonicalize_name(name), version)
if not any((p.name, p.version) == target for p in repository.packages):
    raise KeyError(f"{name} {version} not in repository; refresh lock")
pkg = repository.package(name, version)

Try / catch

from poetry.repositories.exceptions import PackageNotFoundError
try:
    pkg = repository.package(name, version)
except PackageNotFoundError:
    log.warning("%s %s missing from %s; re-lock", name, version, repository.name)
    raise

Prevention

When it happens

Trigger: Calling repo.package(name, version) on a LockedRepository whose lock does not contain that package/version, or on any Repository subclass that relies on the default package() implementation.

Common situations: Lock file out of sync with pyproject.toml; querying a repository object that was populated for a different package set; programmatic use of a custom Repository.

Related errors


AI-assisted analysis of python-poetry/poetry@92b74dcfe3 (2026-08-04). Data as JSON: /data/errors/c73aa4b9692cd042.json. Report an issue: GitHub.