Pip: Pip install block waiting forever for a keyring to unlock

Created on 22 Mar 2020  路  6Comments  路  Source: pypa/pip

Environment

  • pip version: 20.0.2
  • Python version: 3.7.6
  • OS: Fedora


jaraco/keyring: v20.0.1 (automatically installed as PIP dependency)

Description

Pip block during install, waiting for a keyring to unlock (at least that's my understanding)

Expected behavior

Pip install should proceed.
I'm also confused about why pypi try to use any keyring to access pypi.org (See in the verbose output Getting credentials from keyring for https://pypi.org/simple).

How to Reproduce

pip install -vvv --no-deps --no-cache-dir -U importlib-metadata==1.1.3

Workaround
Disable the keyring

PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring
pip install -vvv --no-deps --no-cache-dir -U importlib-metadata==1.1.3

Likely related issue: https://github.com/pypa/pip/issues/6773

Output

Non-user install because user site-packages disabled
Created temporary directory: /tmp/pip-ephem-wheel-cache-710zevvx
Created temporary directory: /tmp/pip-req-tracker-1h_3qnhb
Initialized build tracking at /tmp/pip-req-tracker-1h_3qnhb
Created build tracker: /tmp/pip-req-tracker-1h_3qnhb
Entered build tracker: /tmp/pip-req-tracker-1h_3qnhb
Created temporary directory: /tmp/pip-install-arqqjx8s
1 location(s) to search for versions of importlib-metadata:
* https://pypi.org/simple/importlib-metadata/
Fetching project page and analyzing links: https://pypi.org/simple/importlib-metadata/
Getting page https://pypi.org/simple/importlib-metadata/
Found index url https://pypi.org/simple
Getting credentials from keyring for https://pypi.org/simple
^CCleaning up...
Removed build tracker: '/tmp/pip-req-tracker-1h_3qnhb'
ERROR: Operation cancelled by user
Exception information:
Traceback (most recent call last):
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/cli/base_command.py", line 186, in _main
    status = self.run(options, args)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/commands/install.py", line 331, in run
    resolver.resolve(requirement_set)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/legacy_resolve.py", line 177, in resolve
    discovered_reqs.extend(self._resolve_one(requirement_set, req))
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/legacy_resolve.py", line 333, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/legacy_resolve.py", line 281, in _get_abstract_dist_for
    req.populate_link(self.finder, upgrade_allowed, require_hashes)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/req/req_install.py", line 249, in populate_link
    self.link = finder.find_requirement(self, upgrade)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/index/package_finder.py", line 899, in find_requirement
    req.name, specifier=req.specifier, hashes=hashes,
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/index/package_finder.py", line 881, in find_best_candidate
    candidates = self.find_all_candidates(project_name)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/index/package_finder.py", line 826, in find_all_candidates
    project_url, link_evaluator=link_evaluator,
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/index/package_finder.py", line 790, in process_project_url
    html_page = self._link_collector.fetch_page(project_url)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/index/collector.py", line 497, in fetch_page
    return _get_html_page(location, session=self.session)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/index/collector.py", line 337, in _get_html_page
    resp = _get_html_response(url, session=session)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/index/collector.py", line 143, in _get_html_response
    "Cache-Control": "max-age=0",
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_vendor/requests/sessions.py", line 546, in get
    return self.request('GET', url, **kwargs)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/network/session.py", line 405, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_vendor/requests/sessions.py", line 519, in request
    prep = self.prepare_request(req)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_vendor/requests/sessions.py", line 462, in prepare_request
    hooks=merge_hooks(request.hooks, self.hooks),
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_vendor/requests/models.py", line 317, in prepare
    self.prepare_auth(auth, url)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_vendor/requests/models.py", line 548, in prepare_auth
    r = auth(self)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/network/auth.py", line 202, in __call__
    url, username, password = self._get_url_and_credentials(req.url)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/network/auth.py", line 178, in _get_url_and_credentials
    username, password = self._get_new_credentials(original_url)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/network/auth.py", line 151, in _get_new_credentials
    get_keyring_auth(index_url, username) or
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/pip/_internal/network/auth.py", line 58, in get_keyring_auth
    cred = get_credential(url, username)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/keyring/core.py", line 74, in get_credential
    return _keyring_backend.get_credential(service_name, username)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/keyring/backends/SecretService.py", line 113, in get_credential
    collection = self.get_preferred_collection()
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/keyring/backends/SecretService.py", line 60, in get_preferred_collection
    collection.unlock()
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/secretstorage/collection.py", line 67, in unlock
    return unlock_objects(self.connection, [self.collection_path])
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/secretstorage/util.py", line 154, in unlock_objects
    dismissed, (signature, unlocked) = exec_prompt(connection, prompt)
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/secretstorage/util.py", line 140, in exec_prompt
    connection.recv_messages()
  File "/home/riquito/piggy_store/.env/lib64/python3.7/site-packages/jeepney/integrate/blocking.py", line 64, in recv_messages
    b = unwrap_read(self.sock.recv(4096))
KeyboardInterrupt
keyring

Most helpful comment

Any solution to this? I have the same issue after a reboot on Ubuntu 18.04

Not a solution, but I as a workaround have added the following to my ~/.bashrc

# 1-May-2020: Fix for Keyring error with pip. Hopefully new pip will fix it
# soon https://github.com/pypa/pip/issues/7883
export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring

All 6 comments

having the same issue here, can't understand why keyring is needed on install

Any solution to this? I have the same issue after a reboot on Ubuntu 18.04

Any solution to this? I have the same issue after a reboot on Ubuntu 18.04

Not a solution, but I as a workaround have added the following to my ~/.bashrc

# 1-May-2020: Fix for Keyring error with pip. Hopefully new pip will fix it
# soon https://github.com/pypa/pip/issues/7883
export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring

FYI: https://github.com/pypa/pip/pull/8687 should have made pip less eager in trying to use keyring. We're also聽considering making keyring support in pip into an opt-in: https://github.com/pypa/pip/issues/8719

I just got this on Debian Testing, gnome.

馃悮 pip install --verbose poetry==1.0.9                                                                                 
Non-user install because user site-packages disabled
Created temporary directory: /tmp/pip-ephem-wheel-cache-9bx45e78
Created temporary directory: /tmp/pip-req-tracker-lu2srv1l
Initialized build tracking at /tmp/pip-req-tracker-lu2srv1l
Created build tracker: /tmp/pip-req-tracker-lu2srv1l
Entered build tracker: /tmp/pip-req-tracker-lu2srv1l
Created temporary directory: /tmp/pip-install-t3llvdta
1 location(s) to search for versions of poetry:
* https://pypi.org/simple/poetry/
Fetching project page and analyzing links: https://pypi.org/simple/poetry/
Getting page https://pypi.org/simple/poetry/
Found index url https://pypi.org/simple
Getting credentials from keyring for https://pypi.org/simple

This doesn't happen with a fresh environment, though. Just one with poetry installed.

馃悮 pip freeze                                                                                                          
attrs==20.2.0
CacheControl==0.12.6
cachy==0.3.0
certifi==2020.6.20
cffi==1.14.2
chardet==3.0.4
cleo==0.7.6
clikit==0.4.3
cryptography==3.1
html5lib==1.1
idna==2.10
jeepney==0.4.3
jsonschema==3.2.0
keyring==20.0.1
lockfile==0.12.2
msgpack==1.0.0
pastel==0.2.0
pexpect==4.8.0
pkginfo==1.5.0.1
poetry==1.0.10
ptyprocess==0.6.0
pycparser==2.20
pylev==1.3.0
pyparsing==2.4.7
pyrsistent==0.14.11
requests==2.24.0
requests-toolbelt==0.8.0
SecretStorage==3.1.2
shellingham==1.3.2
six==1.15.0
tomlkit==0.5.11
urllib3==1.25.10
webencodings==0.5.1

(Probably the addition of the non-default keyring package.)

I am also experiencing pip hanging indefinitely on getting credentials from the keyring when using pyenv. It works without the pyenv shims. This is on Ubuntu 20.04, pyenv 1.2.20-18-g5d84eed8 running python3.8.6 environment with pip 20.2.3.
Sample output:

$ pip install -vvv asciinema
Using pip 20.2.3 from /home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip (python 3.8)
Non-user install because site-packages writeable
Created temporary directory: /tmp/pip-ephem-wheel-cache-q3syfjk6
Created temporary directory: /tmp/pip-req-tracker-svoa_2fh
Initialized build tracking at /tmp/pip-req-tracker-svoa_2fh
Created build tracker: /tmp/pip-req-tracker-svoa_2fh
Entered build tracker: /tmp/pip-req-tracker-svoa_2fh
Created temporary directory: /tmp/pip-install-sgviwh00
1 location(s) to search for versions of asciinema:
* https://pypi.org/simple/asciinema/
Fetching project page and analyzing links: https://pypi.org/simple/asciinema/
Getting page https://pypi.org/simple/asciinema/
Found index url https://pypi.org/simple
Getting credentials from keyring for https://pypi.org/simple
^CERROR: Operation cancelled by user
Exception information:
Traceback (most recent call last):
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/cli/base_command.py", line 228, in _main
    status = self.run(options, args)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/cli/req_command.py", line 182, in wrapper
    return func(self, options, args)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/commands/install.py", line 323, in run
    requirement_set = resolver.resolve(
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py", line 183, in resolve
    discovered_reqs.extend(self._resolve_one(requirement_set, req))
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py", line 388, in _resolve_one
    abstract_dist = self._get_abstract_dist_for(req_to_install)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py", line 339, in _get_abstract_dist_for
    self._populate_link(req)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py", line 305, in _populate_link
    req.link = self._find_requirement_link(req)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/resolution/legacy/resolver.py", line 270, in _find_requirement_link
    best_candidate = self.finder.find_requirement(req, upgrade)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/index/package_finder.py", line 898, in find_requirement
    best_candidate_result = self.find_best_candidate(
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/index/package_finder.py", line 881, in find_best_candidate
    candidates = self.find_all_candidates(project_name)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/index/package_finder.py", line 825, in find_all_candidates
    package_links = self.process_project_url(
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/index/package_finder.py", line 790, in process_project_url
    html_page = self._link_collector.fetch_page(project_url)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/index/collector.py", line 643, in fetch_page
    return _get_html_page(location, session=self.session)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/index/collector.py", line 455, in _get_html_page
    resp = _get_html_response(url, session=session)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/index/collector.py", line 152, in _get_html_response
    resp = session.get(
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_vendor/requests/sessions.py", line 543, in get
    return self.request('GET', url, **kwargs)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/network/session.py", line 421, in request
    return super(PipSession, self).request(method, url, *args, **kwargs)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_vendor/requests/sessions.py", line 516, in request
    prep = self.prepare_request(req)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_vendor/requests/sessions.py", line 449, in prepare_request
    p.prepare(
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_vendor/requests/models.py", line 318, in prepare
    self.prepare_auth(auth, url)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_vendor/requests/models.py", line 549, in prepare_auth
    r = auth(self)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/network/auth.py", line 209, in __call__
    url, username, password = self._get_url_and_credentials(req.url)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/network/auth.py", line 184, in _get_url_and_credentials
    username, password = self._get_new_credentials(original_url)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/network/auth.py", line 156, in _get_new_credentials
    get_keyring_auth(index_url, username) or
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/pip/_internal/network/auth.py", line 58, in get_keyring_auth
    cred = get_credential(url, username)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/keyring/core.py", line 68, in get_credential
    return _keyring_backend.get_credential(service_name, username)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/keyring/backends/SecretService.py", line 115, in get_credential
    collection = self.get_preferred_collection()
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/keyring/backends/SecretService.py", line 61, in get_preferred_collection
    collection.unlock()
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/secretstorage/collection.py", line 67, in unlock
    return unlock_objects(self.connection, [self.collection_path])
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/secretstorage/util.py", line 154, in unlock_objects
    dismissed, (signature, unlocked) = exec_prompt(connection, prompt)
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/secretstorage/util.py", line 140, in exec_prompt
    connection.recv_messages()
  File "/home/psacawa/.pyenv/versions/3.8.6/lib/python3.8/site-packages/jeepney/integrate/blocking.py", line 64, in recv_messages
    b = unwrap_read(self.sock.recv(4096))
KeyboardInterrupt
Removed build tracker: '/tmp/pip-req-tracker-svoa_2fh'
Was this page helpful?
0 / 5 - 0 ratings