{"id":"2bfc7500ee604499","repo":"python-poetry/poetry","slug":"the-following-packages-were-not-found-join","errorCode":null,"errorMessage":"The following packages were not found: {', '.join(sorted(not_found))}","messagePattern":"The following packages were not found: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"src/poetry/console/commands/remove.py","lineNumber":164,"sourceCode":"                        packages=packages,\n                        standard_section=groups_content[group],\n                        poetry_section={},\n                        group_name=group,\n                    )\n                )\n                if not groups_content[group]:\n                    del groups_content[group]\n            if group not in groups_content and group not in poetry_groups_content:\n                self._remove_references_to_group(group, content)\n\n        if \"group\" in poetry_content and not poetry_content[\"group\"]:\n            del poetry_content[\"group\"]\n        if \"dependency-groups\" in content and not content[\"dependency-groups\"]:\n            del content[\"dependency-groups\"]\n\n        not_found = set(packages).difference(removed)\n        if not_found:\n            raise ValueError(\n                \"The following packages were not found: \" + \", \".join(sorted(not_found))\n            )\n\n        # Refresh the locker\n        self.poetry.locker.set_pyproject_data(content)\n        self.installer.set_locker(self.poetry.locker)\n        self.installer.set_package(self.poetry.package)\n        self.installer.dry_run(self.option(\"dry-run\", False))\n        self.installer.verbose(self.io.is_verbose())\n        self.installer.update(True)\n        self.installer.execute_operations(not self.option(\"lock\"))\n        self.installer.whitelist(removed)\n\n        status = self.installer.run()\n\n        if not self.option(\"dry-run\") and status == 0:\n            self.poetry.file.write(content)\n","sourceCodeStart":146,"sourceCodeEnd":182,"githubUrl":"https://github.com/python-poetry/poetry/blob/92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54/src/poetry/console/commands/remove.py#L146-L182","documentation":"ValueError from `poetry remove` (remove.py:162-166) when one or more named packages were not located in any dependency section (`[tool.poetry.dependencies]`, `[tool.poetry.group.*.dependencies]`, or `[dependency-groups]`). `removed` accumulates found packages; the set difference yields the missing ones.","triggerScenarios":"Running `poetry remove foes` when only `requests` is declared; removing a transitive dependency that is not a direct requirement; case mismatches.","commonSituations":"Typos; package already removed; package present only in the lock file (transitive) — `remove` only operates on direct requirements.","solutions":["Confirm the exact name with `poetry show` or by inspecting pyproject.toml.","Use the canonical (normalized) name as declared.","If it is a transitive dependency, remove the parent that requires it instead."],"exampleFix":"# before\npoetry remove requets\n# after\npoetry remove requests","handlingStrategy":"validation","validationCode":"from poetry.factory import Factory\npoetry = Factory().create_poetry()\ndeclared = {d.name for d in poetry.package.all_requires}\nrequested = {\"requests\"}\nmissing = requested - declared\nif missing:\n    raise SystemExit(f\"not declared: {sorted(missing)}\")","typeGuard":"def is_declared_dependency(poetry, name: str) -> bool:\n    from packaging.utils import canonicalize_name\n    target = canonicalize_name(name)\n    return any(canonicalize_name(d.name) == target\n               for d in poetry.package.all_requires)","tryCatchPattern":null,"preventionTips":["Pull removal lists from pyproject.toml, not memory.","Canonicalize names before comparison.","Re-run `poetry lock` after structural changes."],"tags":["remove","dependencies","validation"],"analyzedSha":"92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54","analyzedAt":"2026-08-04T20:33:34.072Z","schemaVersion":2}