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
- 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.
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
- 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.
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
- Unable to retrieve the password for {name} from the key ring
- Unable to store the password for {name} in the key ring: {e}
- Access to keyring was requested, but it is not available
- HTTP Error {e.response.status_code}: {e.response.reason} | {
- <error>Failed to clone <info>{url}</>, check your git config
AI-assisted analysis of python-poetry/poetry@92b74dcfe3 (2026-08-04).
Data as JSON: /data/errors/5d8a018a5c52624a.json.
Report an issue: GitHub.