pypa/pip · error · PylockValidationError

Cannot determine sdist filename

Error message

Cannot determine sdist filename

What it means

Raised as PylockValidationError by PackageSdist.filename (a computed property) in packaging.pylock when none of name, path, or url is set, so the sdist filename cannot be derived. The filename is needed downstream for cross-checks (parse_sdist_filename) and for indexing.

Source

Thrown at src/pip/_vendor/packaging/pylock.py:466

    @classmethod
    def _from_dict(cls, d: Mapping[str, Any]) -> Self:
        package_sdist = cls(
            name=_get(d, str, "name"),
            upload_time=_get(d, datetime, "upload-time"),
            url=_get(d, str, "url"),
            path=_get(d, str, "path"),
            size=_get(d, int, "size"),
            hashes=_get_required_as(d, Mapping, _validate_hashes, "hashes"),  # type: ignore[type-abstract]
        )
        _validate_path_url(package_sdist.path, package_sdist.url)
        return package_sdist

    @property
    def filename(self) -> str:
        """Get the filename of the sdist."""
        filename = self.name or _path_name(self.path) or _url_name(self.url)
        if not filename:
            raise PylockValidationError("Cannot determine sdist filename")
        return filename


@dataclass(frozen=True, init=False)
class PackageWheel:
    name: str | None = None
    upload_time: datetime | None = None
    url: str | None = None
    path: str | None = None
    size: int | None = None
    hashes: Mapping[str, str]  # type: ignore[misc]

    def __init__(
        self,
        *,
        name: str | None = None,
        upload_time: datetime | None = None,
        url: str | None = None,

View on GitHub (pinned to d7d0d0a394)

Solutions

  1. Set at least one of name (the filename), path, or url on the sdist entry.
  2. Regenerate the lockfile so the resolver records the sdist URL or filename.
  3. If constructing manually, pass name='pkg-1.0.tar.gz'.
  4. Catch the error and skip/repair the malformed sdist entry.

Example fix

# before
PackageSdist(hashes={...})
# after
PackageSdist(name=\"pkg-1.0.tar.gz\", hashes={...})
Defensive patterns

Strategy: validation

Validate before calling

def sdist_has_filename(sdist_entry: dict) -> bool:
    return bool(sdist_entry.get('name') or sdist_entry.get('path') or sdist_entry.get('url'))

Type guard

def is_named_sdist(d) -> bool:
    return bool(d.get('name') or d.get('path') or d.get('url'))

Try / catch

try:
    _ = package.sdist.filename
except PylockValidationError as e:
    if 'Cannot determine sdist filename' in str(e):
        sdist_entry['name'] = f'{pkg.name}-{pkg.version}.tar.gz'

Prevention

When it happens

Trigger: Constructing a PackageSdist with name=None and neither path nor url, then accessing .filename (e.g. via Package._from_dict's sdist cross-check at line ~617). Also reachable if path/url resolve to empty via _path_name/_url_name.

Common situations: A lockfile entry where the sdist table exists but all locator fields are blank; programmatic construction without setting any identifier.

Related errors


AI-assisted analysis of pypa/pip@d7d0d0a394 (2026-08-04). Data as JSON: /data/errors/1c050aca6ea4a852.json. Report an issue: GitHub.