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
- Set at least one of name (the filename), path, or url on the sdist entry.
- Regenerate the lockfile so the resolver records the sdist URL or filename.
- If constructing manually, pass name='pkg-1.0.tar.gz'.
- 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
- Set name, path, or url on every sdist entry.
- Regenerate lockfiles so the resolver records the sdist URL.
- Construct PackageSdist with name='pkg-1.0.tar.gz' in code.
- Validate sdist entries have a locator before adding.
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
- path or url must be provided
- Cannot determine wheel filename
- None of vcs, directory, archive must be set if sdist or whee
- Exactly one of vcs, directory, archive must be set if sdist
- Invalid wheel filename {wheel.filename!r}
AI-assisted analysis of pypa/pip@d7d0d0a394 (2026-08-04).
Data as JSON: /data/errors/1c050aca6ea4a852.json.
Report an issue: GitHub.