python-poetry/poetry · warning · PoetryKeyringError

Unable to delete the password for {name} from the key ring

Error message

Unable to delete the password for {name} from the key ring

What it means

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.

Source

Thrown at src/poetry/utils/password_manager.py:132

        name = self.get_entry_name(name)

        try:
            keyring.set_password(name, username or self._EMPTY_USERNAME_KEY, password)
        except (RuntimeError, keyring.errors.KeyringError) as e:
            raise PoetryKeyringError(
                f"Unable to store the password for {name} in the key ring: {e}"
            )

    def delete_password(self, name: str, username: str) -> None:
        import keyring.errors

        name = self.get_entry_name(name)

        try:
            keyring.delete_password(name, username or self._EMPTY_USERNAME_KEY)
        except (RuntimeError, keyring.errors.KeyringError):
            raise PoetryKeyringError(
                f"Unable to delete the password for {name} from the key ring"
            )

    def get_entry_name(self, name: str) -> str:
        return f"{self._namespace}-{name}"

    @classmethod
    @functools.cache
    def is_available(cls) -> bool:
        logger.debug("Checking if keyring is available")
        try:
            import keyring
            import keyring.backend
            import keyring.errors
        except ImportError as e:
            logger.debug("An error occurred while importing keyring: %s", e)
            return False

View on GitHub (pinned to 92b74dcfe3)

Solutions

  1. Confirm the credential actually exists under the expected entry name (PoetryKeyring prefixes names with its namespace, e.g. 'poetry-repository-<name>').
  2. Unlock the keyring and retry.
  3. If the entry is already gone, treat the delete as a no-op and suppress PoetryKeyringError.
  4. On headless hosts, set keyring.enabled false so deletes route through config instead.

Example fix

# before
manager.keyring.delete_password(name, user)  # raises if not stored
# after - tolerate missing entry
try:
    manager.keyring.delete_password(name, user)
except PoetryKeyringError:
    pass  # nothing to remove
Defensive patterns

Strategy: try-catch

Try / catch

from poetry.utils.password_manager import PoetryKeyringError
try:
    manager.keyring.delete_password(name, username)
except PoetryKeyringError:
    # entry may already be absent; treat as success
    pass

Prevention

When it happens

Trigger: 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.

Common situations: Trying to delete a credential that was never stored or already removed; locked keyring; misconfigured namespace so the entry name doesn't match.

Related errors


AI-assisted analysis of python-poetry/poetry@92b74dcfe3 (2026-08-04). Data as JSON: /data/errors/5d8a018a5c52624a.json. Report an issue: GitHub.