pypa/pip · error · InvalidSdistFilename
Invalid sdist filename (empty project name): {filename!r}
Error message
Invalid sdist filename (empty project name): {filename!r} What it means
Raised by parse_sdist_filename() when the project-name portion (everything before the last dash) is empty (utils.py:356-359). This happens when the stem starts with a dash, e.g. '-1.0', so rpartition('-') returns ('', '-', '1.0') with an empty name_part.
Source
Thrown at src/pip/_vendor/packaging/utils.py:357
.. _Source distribution format: https://packaging.python.org/specifications/source-distribution-format/#source-distribution-file-name
"""
if filename.endswith(".tar.gz"):
file_stem = filename[: -len(".tar.gz")]
elif filename.endswith(".zip"):
file_stem = filename[: -len(".zip")]
else:
raise InvalidSdistFilename(
f"Invalid sdist filename (extension must be '.tar.gz' or '.zip'):"
f" {filename!r}"
)
# We are requiring a PEP 440 version, which cannot contain dashes,
# so we split on the last dash.
name_part, sep, version_part = file_stem.rpartition("-")
if not sep:
raise InvalidSdistFilename(f"Invalid sdist filename: {filename!r}")
if not name_part:
raise InvalidSdistFilename(
f"Invalid sdist filename (empty project name): {filename!r}"
)
name = canonicalize_name(name_part)
try:
version = Version(version_part)
except InvalidVersion as e:
raise InvalidSdistFilename(
f"Invalid sdist filename (invalid version): {filename!r}"
) from e
return (name, version)
View on GitHub (pinned to f399c37189)
Solutions
- Ensure the project name is non-empty and appears before the version in the filename.
- Rename the file to include a valid project name: {name}-{version}.tar.gz.
- Validate filenames from external sources before parsing.
Example fix
// before
parse_sdist_filename('-1.0.tar.gz')
// after
parse_sdist_filename('foo-1.0.tar.gz') Defensive patterns
Strategy: validation
Validate before calling
def safe_parse_sdist(filename: str):
stem = filename[:-7] if filename.endswith(".tar.gz") else filename[:-4]
name_part, sep, version_part = stem.rpartition("-")
if not name_part:
raise ValueError(f"Sdist filename has empty project name: {filename!r}")
return parse_sdist_filename(filename) Type guard
def has_nonempty_sdist_name(filename: str) -> bool:
if not isinstance(filename, str):
return False
if filename.endswith(".tar.gz"):
stem = filename[:-7]
elif filename.endswith(".zip"):
stem = filename[:-4]
else:
return False
name_part, sep, _ = stem.rpartition("-")
return bool(sep) and bool(name_part) Try / catch
from packaging.utils import InvalidSdistFilename
try:
name, ver = parse_sdist_filename(filename)
except InvalidSdistFilename as e:
if "empty project name" in str(e):
logger.error("Sdist filename starts with a dash: %s", filename)
raise Prevention
- Ensure the project name is non-empty and appears before the version
- Never start an sdist filename with a dash
- Validate the name segment is present after rpartition('-')
When it happens
Trigger: A filename whose stem begins with a dash, e.g. parse_sdist_filename('-1.0.tar.gz') where the name part before the last dash is empty.
Common situations: A malformed filename produced by a buggy build tool, or a manually constructed filename where the project name was accidentally omitted.
Related errors
- Invalid sdist filename {package.sdist.filename!r}
- Invalid project name: {filename!r}
- Invalid sdist filename (extension must be '.tar.gz' or '.zip
- Invalid sdist filename: {filename!r}
- Invalid sdist filename (invalid version): {filename!r}
AI-assisted analysis of pypa/pip@f399c37189 (2026-08-08).
Data as JSON: /api/errors/60305c6676125bef.
Report an issue: GitHub.