{"id":"ed04b9353f04c36b","repo":"pypa/pip","slug":"bad-metadata-in-dist-invalid-metadata-entry-ve","errorCode":null,"errorMessage":"Bad metadata in {dist} (invalid metadata entry `version`)","messagePattern":"Bad metadata in (.+?) \\(invalid metadata entry `version`\\)","errorType":"exception","errorClass":"BadMetadata","httpStatus":null,"severity":"error","filePath":"src/pip/_internal/metadata/importlib/_dists.py","lineNumber":176,"sourceCode":"    def installed_location(self) -> str | None:\n        if self._installed_location is None:\n            return None\n        return normalize_path(str(self._installed_location))\n\n    @property\n    def canonical_name(self) -> NormalizedName:\n        return get_dist_canonical_name(self._dist)\n\n    @property\n    def version(self) -> Version:\n        try:\n            version = (\n                parse_name_and_version_from_info_directory(self._dist)[1]\n                or self._dist.version\n            )\n            return parse_version(version)\n        except TypeError:\n            raise BadMetadata(self._dist, reason=\"invalid metadata entry `version`\")\n\n    @property\n    def raw_version(self) -> str:\n        return self.metadata[\"Version\"]\n\n    def is_file(self, path: InfoPath) -> bool:\n        return self._dist.read_text(str(path)) is not None\n\n    def iter_distutils_script_names(self) -> Iterator[str]:\n        # A distutils installation is always \"flat\" (not in e.g. egg form), so\n        # if this distribution's info location is NOT a pathlib.Path (but e.g.\n        # zipfile.Path), it can never contain any distutils scripts.\n        if not isinstance(self._info_location, pathlib.Path):\n            return\n        for child in self._info_location.joinpath(\"scripts\").iterdir():\n            yield child.name\n\n    def read_text(self, path: InfoPath) -> str:","sourceCodeStart":158,"sourceCodeEnd":194,"githubUrl":"https://github.com/pypa/pip/blob/d7d0d0a39494e28ec1c407bd0680e4a4d1067791/src/pip/_internal/metadata/importlib/_dists.py#L158-L194","documentation":"BadMetadata raised by Distribution.version (importlib backend) when the version string cannot be parsed - either the .dist-info name has no version separator and dist.version is not a usable string, or parse_version() receives a non-string. It indicates non-conformant version metadata.","triggerScenarios":"Reached when parse_name_and_version_from_info_directory returns no version (info dir name lacks '-version') and self._dist.version is None/non-str, so parse_version(None) raises TypeError, caught and re-raised as BadMetadata.","commonSituations":"A .dist-info directory named without a version (e.g. just 'mypkg.dist-info') and a METADATA file with no/malformed Version header; metadata generated by a broken custom build; partial install leftover.","solutions":["Reinstall the package from a clean source to regenerate standard metadata.","Check the .dist-info directory name follows '<name>-<version>.dist-info' and METADATA has a valid PEP 440 'Version' field.","Delete the malformed .dist-info directory and reinstall.","Report to the maintainer if the published artifact is non-compliant."],"exampleFix":"; before - mypkg.dist-info/METADATA\nMetadata-Version: 2.1\nName: mypkg\n; no Version line\n\n; after\nMetadata-Version: 2.1\nName: mypkg\nVersion: 1.0.0","handlingStrategy":"validation","validationCode":"import importlib.metadata, re\nfrom packaging.version import InvalidVersion\nfor d in importlib.metadata.distributions():\n    v = d.version\n    try:\n        parse = type(v); str(v)\n        __import__('packaging.version').Version(str(v))\n    except (TypeError, InvalidVersion):\n        print(f'bad version metadata in {d}')","typeGuard":"def has_valid_version(dist) -> bool:\n    from packaging.version import Version, InvalidVersion\n    v = getattr(dist, 'version', None)\n    try:\n        Version(str(v))\n        return True\n    except (TypeError, InvalidVersion):\n        return False","tryCatchPattern":"from pip._internal.metadata.importlib._compat import BadMetadata\ntry:\n    _ = dist.version\nexcept BadMetadata as e:\n    if 'version' in str(e):\n        # reinstall the dist from a clean source\n        ...","preventionTips":["Ensure .dist-info dirs are named name-version.dist-info.","Always include a PEP 440 Version header in METADATA.","Reinstall packages from PyPI if metadata looks corrupt.","Use current build backends that emit conformant metadata."],"tags":["metadata","version","dist-info","pep440","corruption"],"analyzedSha":"d7d0d0a39494e28ec1c407bd0680e4a4d1067791","analyzedAt":"2026-08-04T20:55:04.259Z","schemaVersion":2}