pypa/pip · error · MetadataInvalid
Requested {self.ireq} has invalid metadata: {self.error}
Error message
Requested {self.ireq} has invalid metadata: {self.error} What it means
_check_metadata_consistency (candidates.py:238-241) parses the distribution's Requires-Dist entries via iter_dependencies; if any dependency string raises InvalidRequirement, pip wraps it as MetadataInvalid. The package's own metadata violates PEP 508 requirement syntax.
Source
Thrown at src/pip/_internal/resolution/resolvelib/candidates.py:241
self._ireq,
"name",
self._name,
dist.canonical_name,
)
if self._version is not None and self._version != dist.version:
raise MetadataInconsistent(
self._ireq,
"version",
str(self._version),
str(dist.version),
)
# check dependencies are valid
# TODO performance: this means we iterate the dependencies at least twice,
# we may want to cache parsed Requires-Dist
try:
list(dist.iter_dependencies(list(dist.iter_provided_extras())))
except InvalidRequirement as e:
raise MetadataInvalid(self._ireq, str(e))
def _prepare(self) -> BaseDistribution:
try:
dist = self._prepare_distribution()
except HashError as e:
# Provide HashError the underlying ireq that caused it. This
# provides context for the resulting error message to show the
# offending line to the user.
e.req = self._ireq
raise
except InstallationSubprocessError as exc:
if isinstance(self._ireq.comes_from, InstallRequirement):
request_chain = self._ireq.comes_from.from_path()
else:
request_chain = self._ireq.comes_from
if request_chain is None:
request_chain = "directly requested"View on GitHub (pinned to f399c37189)
Solutions
- Report the malformed metadata to the package maintainer.
- Pin to a version of the package known to have valid metadata.
- Fork/rebuild the package with corrected METADATA and install from your fixed source.
Defensive patterns
Strategy: validation
Validate before calling
# Validate a wheel's Requires-Dist entries parse as PEP 508 before install.
import zipfile, sys
from packaging.requirements import Requirement, InvalidRequirement
whl = sys.argv[1]
with zipfile.ZipFile(whl) as z:
meta = [n for n in z.namelist() if n.endswith("METADATA")][0]
for line in z.read(meta).decode().splitlines():
if line.startswith("Requires-Dist:"):
spec = line.split(":", 1)[1].strip()
try:
Requirement(spec)
except InvalidRequirement as e:
print(f"INVALID Requires-Dist in {whl}: {spec!r} ({e})") Prevention
- Validate package metadata with twine check before publishing.
- Pin to package versions with known-good metadata.
- Keep packaging/setuptools current when building distributions.
When it happens
Trigger: Installing a package whose METADATA contains a malformed Requires-Dist value (invalid PEP 508 specifier syntax), detected during candidate preparation.
Common situations: Upstream packaging bug; a hand-edited METADATA; a very old package using non-standard dependency notation.
Related errors
- Requested {ireq} has invalid metadata: Requires-Dist in {sou
- Invalid requirement: {req_string!r}: {exc}
- invalid-installed-package
- Index {link.comes_from} does not provide upload-time metadat
- Bad metadata in {dist} (invalid metadata entry 'name')
AI-assisted analysis of pypa/pip@f399c37189 (2026-08-08).
Data as JSON: /api/errors/3f60a3677322b2a4.
Report an issue: GitHub.