{"id":"5d8a018a5c52624a","repo":"python-poetry/poetry","slug":"unable-to-delete-the-password-for-name-from-the","errorCode":null,"errorMessage":"Unable to delete the password for {name} from the key ring","messagePattern":"Unable to delete the password for (.+?) from the key ring","errorType":"exception","errorClass":"PoetryKeyringError","httpStatus":null,"severity":"warning","filePath":"src/poetry/utils/password_manager.py","lineNumber":132,"sourceCode":"\n        name = self.get_entry_name(name)\n\n        try:\n            keyring.set_password(name, username or self._EMPTY_USERNAME_KEY, password)\n        except (RuntimeError, keyring.errors.KeyringError) as e:\n            raise PoetryKeyringError(\n                f\"Unable to store the password for {name} in the key ring: {e}\"\n            )\n\n    def delete_password(self, name: str, username: str) -> None:\n        import keyring.errors\n\n        name = self.get_entry_name(name)\n\n        try:\n            keyring.delete_password(name, username or self._EMPTY_USERNAME_KEY)\n        except (RuntimeError, keyring.errors.KeyringError):\n            raise PoetryKeyringError(\n                f\"Unable to delete the password for {name} from the key ring\"\n            )\n\n    def get_entry_name(self, name: str) -> str:\n        return f\"{self._namespace}-{name}\"\n\n    @classmethod\n    @functools.cache\n    def is_available(cls) -> bool:\n        logger.debug(\"Checking if keyring is available\")\n        try:\n            import keyring\n            import keyring.backend\n            import keyring.errors\n        except ImportError as e:\n            logger.debug(\"An error occurred while importing keyring: %s\", e)\n            return False\n","sourceCodeStart":114,"sourceCodeEnd":150,"githubUrl":"https://github.com/python-poetry/poetry/blob/92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54/src/poetry/utils/password_manager.py#L114-L150","documentation":"PoetryKeyring.delete_password wraps keyring.delete_password and, on RuntimeError or keyring.errors.KeyringError (including PasswordDeleteError when no entry exists), raises PoetryKeyringError. The stored credential could not be removed from the keyring.","triggerScenarios":"Removing a stored password/token (e.g. via `poetry config --unset` of a credential) when the keyring errors: entry does not exist (PasswordDeleteError), keyring locked, or backend failure.","commonSituations":"Trying to delete a credential that was never stored or already removed; locked keyring; misconfigured namespace so the entry name doesn't match.","solutions":["Confirm the credential actually exists under the expected entry name (PoetryKeyring prefixes names with its namespace, e.g. 'poetry-repository-<name>').","Unlock the keyring and retry.","If the entry is already gone, treat the delete as a no-op and suppress PoetryKeyringError.","On headless hosts, set keyring.enabled false so deletes route through config instead."],"exampleFix":"# before\nmanager.keyring.delete_password(name, user)  # raises if not stored\n# after - tolerate missing entry\ntry:\n    manager.keyring.delete_password(name, user)\nexcept PoetryKeyringError:\n    pass  # nothing to remove","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"from poetry.utils.password_manager import PoetryKeyringError\ntry:\n    manager.keyring.delete_password(name, username)\nexcept PoetryKeyringError:\n    # entry may already be absent; treat as success\n    pass","preventionTips":["Tolerate 'not found' on deletes (PasswordDeleteError surfaces here).","Use the same entry name/namespace used when storing.","Disable keyring in headless setups to route deletes through config."],"tags":["keyring","credentials","cleanup","authentication"],"analyzedSha":"92b74dcfe348d0e01e14d40d6c1fa47a4ee04a54","analyzedAt":"2026-08-04T20:33:34.072Z","schemaVersion":2}