python-poetry/poetry · warning · PoetryKeyringError

Unable to delete the password for

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.

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: /api/errors/5d8a018a5c52624a. Report an issue: GitHub.

Appendix: 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)