python-poetry/poetry · error · PoetryKeyringError

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

Error message

Unable to retrieve the password for {name} from the key ring {e}

What it means

PoetryKeyring.get_password wraps keyring.get_password(name, username) and, on RuntimeError or keyring.errors.KeyringError, raises PoetryKeyringError carrying the underlying exception text. It means the OS/secret-service keyring rejected or failed the read of a stored credential.

Source

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

                logger.debug("Accessing keyring %s failed", name, exc_info=True)

            if credential:
                return HTTPAuthCredential(
                    username=credential.username, password=credential.password
                )

        return HTTPAuthCredential(username=username, password=None)

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

        name = self.get_entry_name(name)

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

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

        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

View on GitHub (pinned to 92b74dcfe3)

Solutions

  1. Unlock the OS keyring/keychain and ensure the Secret Service / D-Bus session is available.
  2. On headless/CI hosts, disable the keyring (`poetry config keyring.enabled false`) and pass credentials via env vars or config.
  3. Retry after restarting the keyring daemon.
  4. Confirm PoetryKeyring.is_available() returns true in that environment before relying on it.

Example fix

# before - relying on keyring in CI
poetry config http-basic.acme $USER $TOKEN   # tries keyring, fails
# after - disable keyring, use env / config in CI
poetry config keyring.enabled false
poetry config http-basic.acme "$USER" "$TOKEN"
Defensive patterns

Strategy: try-catch

Validate before calling

from poetry.utils.password_manager import PoetryKeyring

# only attempt keyring reads when a backend is usable
if not PoetryKeyring.is_available():
    raise RuntimeError('keyring unavailable; use env/config credentials')

Try / catch

from poetry.utils.password_manager import PoetryKeyringError
try:
    pw = manager.get_password(name, username)
except PoetryKeyringError:
    # fall back to env var / config
    import os
    pw = os.environ.get('POETRY_HTTP_BASIC_<REPO>_PASSWORD')

Prevention

When it happens

Trigger: PasswordManager.get_password / get_http_credentials for a configured source when the keyring backend errors: GNOME Keyring locked, Secret Service/D-Bus unavailable, macOS Keychain locked, or a backend crash.

Common situations: Running over SSH without a D-Bus session; headless CI where the keyring is locked or absent; SELinux/AppArmor blocking keyring access; keyring daemon crashed.

Related errors


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