Pip: Pip 20.2.4 goes into infinite resolution of dependencies

Created on 19 Oct 2020  Β·  40Comments  Β·  Source: pypa/pip

Hello,

My CI goes into infinite resolution when trying to install a project's dependencies for testing:

pip install -e .[test] --use-feature=2020-resolver -i https://artifactory.company.com/api/pypi/pypi/simple

Output

Looking in indexes: https://artifactory.company.com/api/pypi/pypi/simple
Collecting deprecation
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/02/c3/253a89ee03fc9b9682f1541728eb66db7db22148cd94f89ab22528cd1e1b/deprecation-2.1.0-py2.py3-none-any.whl (11 kB)
Collecting six
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting toolz
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/12/f5/537e55f8ba664ff2a26f26913010fb0fcb98b6bbadc6158af888184fd0b7/toolz-0.11.1-py3-none-any.whl (55 kB)
Collecting packaging
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/46/19/c5ab91b1b05cfe63cccd5cfc971db9214c6dd6ced54e33c30d5af1d2bc43/packaging-20.4-py2.py3-none-any.whl (37 kB)
Collecting pyparsing>=2.0.2
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/8a/bb/488841f56197b13700afd5658fc279a2025a39e22449b7cf29864669b15d/pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Installing collected packages: six, pyparsing, packaging, toolz, deprecation
Successfully installed deprecation-2.1.0 packaging-20.4 pyparsing-2.4.7 six-1.15.0 toolz-0.11.1
$ pip install git+https://${CI_REGISTRY_USER}:${CI_JOB_TOKEN}@gitlab.company.com/proj/pygraph.git@Dev_Py3 ${PIP_OPTS}
Looking in indexes: https://artifactory.company.com/api/pypi/pypi/simple
Collecting git+https://gitlab-ci-token:****@gitlab.company.com/proj/pygraph.git@Dev_Py3
  Cloning https://gitlab-ci-token:****@gitlab.company.com/proj/pygraph.git (to revision Dev_Py3) to /tmp/pip-req-build-eulnmcb2
Collecting networkx==2.*
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/9b/cd/dc52755d30ba41c60243235460961fc28022e5b6731f16c268667625baea/networkx-2.5-py3-none-any.whl (1.6 MB)
Collecting redis
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/a7/7c/24fb0511df653cf1a5d938d8f5d19802a88cef255706fdda242ff97e91b7/redis-3.5.3-py2.py3-none-any.whl (72 kB)
Collecting decorator>=4.3.0
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/ed/1b/72a1821152d07cf1d8b6fce298aeb06a7eb90f4d6d41acec9861e7cc6df0/decorator-4.4.2-py2.py3-none-any.whl (9.2 kB)
Building wheels for collected packages: graph-pygraph
  Building wheel for graph-pygraph (setup.py): started
  Building wheel for graph-pygraph (setup.py): finished with status 'done'
  Created wheel for graph-pygraph: filename=graph_pygraph-0.0.202010091542+devpy3-py3-none-any.whl size=71373 sha256=610fe21400ba7adec344b8345b819d42244631d11227a24bfb0fe068c959c309
  Stored in directory: /tmp/pip-ephem-wheel-cache-ovmjos36/wheels/7e/80/09/96d325dfa75fe4d16a6345d433dc8d944ebe48f4a049a12633
Successfully built graph-pygraph
Installing collected packages: decorator, redis, networkx, graph-pygraph
Successfully installed decorator-4.4.2 graph-pygraph-0.0.202010091542+devpy3 networkx-2.5 redis-3.5.3
$ pip install git+https://${CI_REGISTRY_USER}:${CI_JOB_TOKEN}@gitlab.company.com/proj/parser.git@Dev_Py3 ${PIP_OPTS}
Looking in indexes: https://artifactory.company.com/api/pypi/pypi/simple
Collecting git+https://gitlab-ci-token:****@gitlab.company.com/proj/parser.git@Dev_Py3
  Cloning https://gitlab-ci-token:****@gitlab.company.com/proj/parser.git (to revision Dev_Py3) to /tmp/pip-req-build-h_satb7q
Requirement already satisfied: deprecation in ./.venv/lib/python3.6/site-packages (from graph-parser==0.0.202009100923+devpy3) (2.1.0)
Requirement already satisfied: six in ./.venv/lib/python3.6/site-packages (from graph-parser==0.0.202009100923+devpy3) (1.15.0)
Collecting defusedxml
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/06/74/9b387472866358ebc08732de3da6dc48e44b0aacd2ddaa5cb85ab7e986a2/defusedxml-0.6.0-py2.py3-none-any.whl (23 kB)
Requirement already satisfied: packaging in ./.venv/lib/python3.6/site-packages (from deprecation->graph-parser==0.0.202009100923+devpy3) (20.4)
Requirement already satisfied: six in ./.venv/lib/python3.6/site-packages (from graph-parser==0.0.202009100923+devpy3) (1.15.0)
Requirement already satisfied: pyparsing>=2.0.2 in ./.venv/lib/python3.6/site-packages (from packaging->deprecation->graph-parser==0.0.202009100923+devpy3) (2.4.7)
Building wheels for collected packages: graph-parser
  Building wheel for graph-parser (setup.py): started
  Building wheel for graph-parser (setup.py): finished with status 'done'
  Created wheel for graph-parser: filename=graph_parser-0.0.202009100923+devpy3-py3-none-any.whl size=20698 sha256=f2d7b651180d9f844b7aafe8b9431938ceecbfec798407c47b7258b94528c75c
  Stored in directory: /tmp/pip-ephem-wheel-cache-bmna_g2x/wheels/fb/eb/f2/38806b77dcb72c250f63911a3567922b604ab6e88ab74ff980
Successfully built graph-parser
Installing collected packages: defusedxml, graph-parser
Successfully installed defusedxml-0.6.0 graph-parser-0.0.202009100923+devpy3
$ pip install git+https://${CI_REGISTRY_USER}:${CI_JOB_TOKEN}@gitlab.company.com/proj/interfaces.git@Dev_Py3 --no-deps ${PIP_OPTS}
Looking in indexes: https://artifactory.company.com/api/pypi/pypi/simple
Collecting git+https://gitlab-ci-token:****@gitlab.company.com/proj/interfaces.git@Dev_Py3
  Cloning https://gitlab-ci-token:****@gitlab.company.com/proj/interfaces.git (to revision Dev_Py3) to /tmp/pip-req-build-20dgw2sv
Building wheels for collected packages: graph-interfaces
  Building wheel for graph-interfaces (setup.py): started
  Building wheel for graph-interfaces (setup.py): finished with status 'done'
  Created wheel for graph-interfaces: filename=graph_interfaces-0.0.202009180922+devpy3-py3-none-any.whl size=36309 sha256=4a461620d4810f49bd1072a202ab767d56a171bcaa6c5609dcdbaadcc7c4f0a9
  Stored in directory: /tmp/pip-ephem-wheel-cache-5fdbdk3o/wheels/03/ab/79/5bc1653cb185c54b17d12b2b8d495e5231cf117605d3073d9e
Successfully built graph-interfaces
Installing collected packages: graph-interfaces
Successfully installed graph-interfaces-0.0.202009180922+devpy3
$ pip install git+https://${CI_REGISTRY_USER}:${CI_JOB_TOKEN}@gitlab.company.com/proj/post-binding.git@Dev_Py3 --no-deps ${PIP_OPTS}
Looking in indexes: https://artifactory.company.com/api/pypi/pypi/simple
Collecting git+https://gitlab-ci-token:****@gitlab.company.com/proj/post-binding.git@Dev_Py3
  Cloning https://gitlab-ci-token:****@gitlab.company.com/proj/post-binding.git (to revision Dev_Py3) to /tmp/pip-req-build-94mbisdx
Building wheels for collected packages: graph-post-bindings
  Building wheel for graph-post-bindings (setup.py): started
  Building wheel for graph-post-bindings (setup.py): finished with status 'done'
  Created wheel for graph-post-bindings: filename=graph_post_bindings-Dev-py3-none-any.whl size=211749 sha256=efbf8dfa72e4e461740a19a1208952d712fdcace52f17379fd7ad18d9da3b912
  Stored in directory: /tmp/pip-ephem-wheel-cache-vwr6n_g0/wheels/43/7e/ef/8849b821244fee59fc5b97c8694cf87e5609633ea26d65f8a0
Successfully built graph-post-bindings
Installing collected packages: graph-post-bindings
Successfully installed graph-post-bindings-Dev
$ pip install -e .[test] ${PIP_OPTS}
Looking in indexes: https://artifactory.company.com/api/pypi/pypi/simple
Obtaining file:///tmp/proj/scenarios
Requirement already satisfied: graph-pygraph<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202010091542+devpy3)
Requirement already satisfied: graph-interfaces<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202009180922+devpy3)
Requirement already satisfied: graph-parser<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202009100923+devpy3)
Requirement already satisfied: graph-post_bindings==Dev in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (Dev)
Requirement already satisfied: toolz in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.11.1)
Requirement already satisfied: graph-pygraph<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202010091542+devpy3)
Requirement already satisfied: graph-interfaces<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202009180922+devpy3)
Requirement already satisfied: graph-parser<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202009100923+devpy3)
Requirement already satisfied: graph-post_bindings==Dev in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (Dev)
Requirement already satisfied: toolz in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.11.1)
Collecting cerberus
  Downloading https://artifactory.company.com/api/pypi/pypi/packages/packages/90/a7/71c6ed2d46a81065e68c007ac63378b96fa54c7bb614d653c68232f9c50c/Cerberus-1.3.2.tar.gz (52 kB)
Requirement already satisfied: setuptools in ./.venv/lib/python3.6/site-packages (from cerberus->graph-scenarios==0.0.202010191027+unknown) (50.3.2)
Requirement already satisfied: redis in ./.venv/lib/python3.6/site-packages (from graph-pygraph<1->graph-scenarios==0.0.202010191027+unknown) (3.5.3)
Requirement already satisfied: networkx==2.* in ./.venv/lib/python3.6/site-packages (from graph-pygraph<1->graph-scenarios==0.0.202010191027+unknown) (2.5)
Requirement already satisfied: graph-parser<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202009100923+devpy3)
Requirement already satisfied: graph-pygraph<1 in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.0.202010091542+devpy3)
Requirement already satisfied: redis in ./.venv/lib/python3.6/site-packages (from graph-pygraph<1->graph-scenarios==0.0.202010191027+unknown) (3.5.3)
Requirement already satisfied: deprecation in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (2.1.0)
Requirement already satisfied: six in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (1.15.0)
Requirement already satisfied: defusedxml in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (0.6.0)
Requirement already satisfied: toolz in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.11.1)
Collecting graph-parser<1
  Downloading https://artifactory.company.com/api/pypi/pypi/graph-parser/0.0.202009100923%2Bunknown/graph_parser-0.0.202009100923%2Bunknown-py3-none-any.whl (20 kB)
Requirement already satisfied: deprecation in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (2.1.0)
Requirement already satisfied: six in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (1.15.0)
Requirement already satisfied: defusedxml in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (0.6.0)
Requirement already satisfied: toolz in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.11.1)

I get the last 4 lines repeating forever:

Requirement already satisfied: deprecation in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (2.1.0)
Requirement already satisfied: six in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (1.15.0)
Requirement already satisfied: defusedxml in ./.venv/lib/python3.6/site-packages (from graph-parser<1->graph-scenarios==0.0.202010191027+unknown) (0.6.0)
Requirement already satisfied: toolz in ./.venv/lib/python3.6/site-packages (from graph-scenarios==0.0.202010191027+unknown) (0.11.1)

Additional information

In the above output, PIP_OPTS is set to --use-feature=2020-resolver -i https://artifactory.company.com/api/pypi/pypi/simple.

We use a company hosted index that does not have any issues with pip==20.2.3.

!release blocker new resolver bug

Most helpful comment

Thanks! I’ve managed to limit the problematic requirement set to

pytest-mock>=1.11.0
pytest-sugar>=0.9.3
pytest-testmon<1.0.0
coverage==5.3

Removing any one of these and the resolver would be able to produce a solution. I’ll try to build a test case and work from there (hopefully during the week).


Note (to self): My current hypothesis is this issue can be triggered if the resolver sees more than one unrelated conflicts. It would see one, backtrack for that, see the other one, backtrack for that, and hit the first one again.

All 40 comments

Hi! Thanks for filing this issue! Could you share the requirements that pip is trying to install? This would be in the setup.py/pyproject.toml for the relevant project.

The "public" dependencies are:

    install_requires=[
        'cerberus',
        '<inhouse component 1>',
        '<inhouse component 2>',
        '<inhouse component 3>',
        '<inhouse component 4>',
        '<inhouse component 5>',
        'pint',
        '<inhouse component 6>',
        '<inhouse component 7>',
        'toolz',
        'pyyaml>=5.1',
    ],
    extras_require={'test': ['pylint', 'pytest>=4', 'pytest-cov', 'pytest-html', 'pytest-xdist',]},

however as you can see we have multiple inhouse libraries that are also required.

Here's a pip list of what version 20.2.3 installs in case it helps:

$ pip list
Package              Version                  Location
-------------------- ------------------------ ------------------
amqp                 5.0.1
apipkg               1.5
asteval              0.9.19
astroid              2.4.2
attrs                20.2.0
<inhouse>
billiard             3.6.3.0
celery               5.0.1
Cerberus             1.3.2
certifi              2020.6.20
chardet              3.0.4
click                7.1.2
click-didyoumean     0.0.3
click-repl           0.1.6
coverage             5.3
cycler               0.10.0
decorator            4.4.2
defusedxml           0.6.0
deprecation          2.1.0
execnet              1.7.1
future               0.18.2
<inhouse>
<inhouse>
<inhouse>
<inhouse>
<inhouse>
h5py                 2.10.0
importlib-metadata   2.0.0
importlib-resources  3.0.0
iniconfig            1.1.1
isort                5.6.4
kiwisolver           1.2.0
kombu                5.0.2
lazy-object-proxy    1.4.3
<inhouse>
lmfit                1.0.1
matplotlib           3.3.2
mccabe               0.6.1
munch                2.5.0
networkx             2.5
numpy                1.19.2
packaging            20.4
pandas               1.1.3
Pillow               8.0.0
Pint                 0.16.1
pip                  20.2.3
pluggy               0.13.1
<inhouse>
<inhouse>
prompt-toolkit       3.0.8
py                   1.9.0
<inhouse>
<inhouse>
<inhouse>
pylint               2.6.0
pyparsing            2.4.7
<inhouse>
pytest               6.1.1
pytest-cov           2.10.1
pytest-forked        1.3.0
pytest-html          2.1.1
pytest-metadata      1.10.0
WARNING: You are using pip version 20.2.3; however, version 20.2.4 is available.
You should consider upgrading via the '/tmp/ues/scenarios/.venv/bin/python -m pip install --upgrade pip' command.
pytest-xdist         2.1.0
python-dateutil      2.8.1
pytz                 2020.1
PyYAML               5.3.1
redis                3.5.3
scipy                1.5.3
setuptools           50.3.2
six                  1.15.0
tabulate             0.8.7
toml                 0.10.1
toolz                0.11.1
typed-ast            1.4.1
uncertainties        3.1.4
vine                 5.0.0
wcwidth              0.2.5
wheel                0.35.1
wrapt                1.12.1
xlwt                 1.3.0
zipp                 3.3.1

Not sure if it will end up being relevant, but it might be worth noting that I _pre-pip install_ deprecation six toolz, meaning that I actually do:

pip install deprecation six toolz ${PIP_OPTS}
# some more pip installation using the new resolver
pip install -e .[test] ${PIP_OPTS}

Thanks for sharing that. However, this information still isn't sufficient to reproduce this issue. :(

I'd basically need the entire mapping of (package-name, version): [dependencies] that pip sees during the resolution process to be able to debug this, and I obviously can't look up the dependencies of your internal packages. ;)

So, a couple of related questions:

  • could you possibly create a minimal reproducer for this, so that we can try this without needing access to the internal packages? :)

    • if not, would it be possible to provide something like the mapping I mentioned above, for the packages that pip looks at during the resolution process?

  • does this error occur even when installing as . instead of .[test] (i.e. without the test extra)?

I'd basically need to recreate/see what the internal state of the resolver is, when it gets stuck, which we don't print out/log anywhere for a bunch of reasons.

Okay so I've been trying to reproduce the issue locally without any success.

I've tried to reproduce this in our CI on another branch and again it did not fail.

So I went back to the original branch that was have issues earlier today and switched back to 20.2.4 and it succeeded in resolving the dependencies this time...

Could this be an issue with caching or something?

Our CI works with k8s runners so I doubt this could be the case.

Should I close this and reopen if it happens again?

Could this be an issue with caching or something?

pip doesn't cache anything during dependency resolution -- only network I/O. I don't think it could be that.

Should I close this and reopen if it happens again?

Sure! That works for me. If you are able to come up with a reproducer, that'd be awesome!

Hey, I'm also seeing a similar problem that suddenly began a day ago.

On pip 20.2.4, I'm able to reproduce this with just

pip install --use-feature=2020-resolver "google-api-core>1.18.0,<1.21.0" "google-cloud-monitoring>=2.0.0"

The behavior seems a bit non-deterministic, but each time it will start downloading many versions (possibly _every_ version!) of a dependency and either get stuck in a Requirement already satisfied loop or just appears to freeze entirely. This is a boiled down example, but we had a CI build get stuck for 6 hours before getting killed.

Notice that the two libs I'm trying to install actually cause a version conflict and if I drop the --use-feature=2020-resolver I get a normal error message:

google-cloud-monitoring 2.0.0 requires google-api-core[grpc]<2.0.0dev,>=1.22.2, but you'll have google-api-core 1.20.1 which is incompatible.

also if I drop down to pip 20.2.3 (and use the 2020-resolver) I also quickly get a dependency conflict error.

If I change the above requirement to google-cloud-monitoring<2.0.0 then it works fine, both with and without the 2020-resolver

Hope this helps

I just ran into this as well - I ran the new resolver against an existing (quite large) requirements.txt file and it ended up running into an infinite loop of Requirement already satisfied.

Here are my steps to reproduce: https://gist.github.com/simonw/c53ad97ac2cd495e741b52f88d22b45d

Shorter version: I ran pip install --use-feature=2020-resolver -r requirements.txt against this file: https://gist.githubusercontent.com/simonw/c53ad97ac2cd495e741b52f88d22b45d/raw/e09640304fcdf1990844f8ff8ecc92ef654d21b7/requirements.txt

Running without the --use-feature= flag gives me this:

ERROR: After October 2020 you may experience errors when installing or updating packages. This is because pip will change the way that it resolves dependency conflicts.

We recommend you use --use-feature=2020-resolver to test your packages with the new resolver before it becomes the default.

pocket-to-sqlite 0.2 requires sqlite-utils~=2.4.4, but you'll have sqlite-utils 2.22 which is incompatible.
healthkit-to-sqlite 0.5 requires sqlite-utils~=2.4.4, but you'll have sqlite-utils 2.22 which is incompatible.

Though oddly the infinite loop problem didn't mention those packages - it looked like this:

Collecting twitter-to-sqlite~=0.20
  Using cached twitter_to_sqlite-0.20-py3-none-any.whl (25 kB)
Requirement already satisfied: click~=7.1.1 in /Users/simon/.local/share/virtualenvs/pipnext-HNJm0oR8/lib/python3.8/site-packages (from datasette>=0.50.2->-r requirements.txt (line 2)) (7.1.2)
Requirement already satisfied: click~=7.1.1 in /Users/simon/.local/share/virtualenvs/pipnext-HNJm0oR8/lib/python3.8/site-packages (from datasette>=0.50.2->-r requirements.txt (line 2)) (7.1.2)
...

I fixed my problem by switching all of my ~= requirements for >= requirements.

So I think there's a bug here, but it's a user interface bug: the infinite looping requirements appears to have been triggered by the dependency conflict that showed in the warning, but the error itself (infinite loop over Requirement already satisfied for some unrelated package) was really confusing.

Per conversation in a meeting this week, @pradyunsg needs to further investigate this -- help from others would be welcome too (@pfmoore and @uranusjr in case you have a moment to help out).

@pradyunsg is this something you could poke at on Tuesday?

I'm unlikely to have the bandwidth in the short term, but I might take a look when I do have spare time.

Using the current master branch, all reproducers are failing basically immediately. I've run them in a clean virtualenv on an Ubuntu VM, with pip's master branch installed in editable mode w/ setuptools 41.2.0.

@DanSimon's https://github.com/pypa/pip/issues/9011#issuecomment-712280236:

$ pip install --use-feature=2020-resolver "google-api-core>1.18.0,<1.21.0" "google-cloud-monitoring>=2.0.0"
Collecting google-cloud-monitoring>=2.0.0
  Using cached google_cloud_monitoring-2.0.0-py2.py3-none-any.whl (287 kB)
Collecting google-api-core<1.21.0,>1.18.0
  Using cached google_api_core-1.20.1-py2.py3-none-any.whl (90 kB)
Requirement already satisfied: setuptools>=34.0.0 in ./pythonenv3.8/lib/python3.8/site-packages (from google-api-core<1.21.0,>1.18.0) (41.2.0)
Collecting google-api-core[grpc]<2.0.0dev,>=1.22.2
  Using cached google_api_core-1.23.0-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.4-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.3-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.2-py2.py3-none-any.whl (91 kB)
Collecting google-api-core<1.21.0,>1.18.0
  Downloading google_api_core-1.19.1-py2.py3-none-any.whl (90 kB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 90 kB 4.4 MB/s 
Requirement already satisfied: setuptools>=34.0.0 in ./pythonenv3.8/lib/python3.8/site-packages (from google-api-core<1.21.0,>1.18.0) (41.2.0)
  Downloading google_api_core-1.19.0-py2.py3-none-any.whl (90 kB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 90 kB 4.7 MB/s 
Requirement already satisfied: setuptools>=34.0.0 in ./pythonenv3.8/lib/python3.8/site-packages (from google-api-core<1.21.0,>1.18.0) (41.2.0)
  Downloading google_api_core-1.20.0-py2.py3-none-any.whl (90 kB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 90 kB 5.9 MB/s 
Requirement already satisfied: setuptools>=34.0.0 in ./pythonenv3.8/lib/python3.8/site-packages (from google-api-core<1.21.0,>1.18.0) (41.2.0)
ERROR: Cannot install google-api-core<1.21.0 and >1.18.0, google-api-core[grpc] 1.23.0, google-api-core<1.21.0 and >1.18.0, google-api-core[grpc] 1.22.4, google-api-core<1.21.0 and >1.18.0, google-api-core[grpc] 1.22.3, google-api-core<1.21.0 and >1.18.0 and google-api-core[grpc] 1.22.2 because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested google-api-core<1.21.0 and >1.18.0
    google-api-core[grpc] 1.23.0 depends on google-api-core 1.23.0 (from https://files.pythonhosted.org/packages/2e/3d/d7af13040ab5b259994a4434ff03d68084a994e709bc8afa4bee1235310e/google_api_core-1.23.0-py2.py3-none-any.whl#sha256=94d8c707d358d8d9e8b0045c42be20efb58433d308bd92cf748511c7825569c8 (from https://pypi.org/simple/google-api-core/) (requires-python:>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*))
    The user requested google-api-core<1.21.0 and >1.18.0
    google-api-core[grpc] 1.22.4 depends on google-api-core 1.22.4 (from https://files.pythonhosted.org/packages/9f/52/e7720d652aeb7d514d3a2e62d263c8058f465beee2fc41260591c0fecc3a/google_api_core-1.22.4-py2.py3-none-any.whl#sha256=15e00ceb7e6dc44159e2a41a222830744e9ebcb3a553c580b61cb5a66572f2f0 (from https://pypi.org/simple/google-api-core/) (requires-python:>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*))
    The user requested google-api-core<1.21.0 and >1.18.0
    google-api-core[grpc] 1.22.3 depends on google-api-core 1.22.3 (from https://files.pythonhosted.org/packages/eb/b0/ea7b8a2c136095c5be2f14210b31b214cb74c1eb8fee09a01ad0423a2a95/google_api_core-1.22.3-py2.py3-none-any.whl#sha256=6a95bfcf6f661ec0dffd96013b47100765f4f88ce54412562176bfcb11a997c1 (from https://pypi.org/simple/google-api-core/) (requires-python:>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*))
    The user requested google-api-core<1.21.0 and >1.18.0
    google-api-core[grpc] 1.22.2 depends on google-api-core 1.22.2 (from https://files.pythonhosted.org/packages/3c/45/a5707ce2cbd6681c09e69a0ce10d9bebe98e0231c458a4dc652670f3584f/google_api_core-1.22.2-py2.py3-none-any.whl#sha256=67e33a852dcca7cb7eff49abc35c8cc2c0bb8ab11397dc8306d911505cae2990 (from https://pypi.org/simple/google-api-core/) (requires-python:>=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*))

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies

@simonw's https://github.com/pypa/pip/issues/9011#issuecomment-714025122:

$ pip install --use-feature=2020-resolver -r requirements.txt
Collecting https://github.com/simonw/goodreads-to-sqlite/archive/f3d5cd1692e8b5f830416512c6778079e500917a.zip (from -r requirements.txt (line 38))
  Downloading https://github.com/simonw/goodreads-to-sqlite/archive/f3d5cd1692e8b5f830416512c6778079e500917a.zip
     | 364 kB 16.8 MB/s
Collecting datasette>=0.50.2
  Downloading datasette-0.50.2-py3-none-any.whl (205 kB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 205 kB 10.8 MB/s 
Collecting datasette-haversine
  Downloading datasette_haversine-0.1-py3-none-any.whl (6.5 kB)
Collecting datasette-render-markdown>=1.1.2
  Downloading datasette_render_markdown-1.1.2-py3-none-any.whl (8.7 kB)
Collecting datasette-show-errors
  Downloading datasette_show_errors-0.2-py3-none-any.whl (6.3 kB)
Collecting datasette-write
  Downloading datasette_write-0.1-py3-none-any.whl (3.6 kB)
Collecting datasette-init
  Downloading datasette_init-0.2-py3-none-any.whl (2.9 kB)
Collecting dogsheep-beta>=0.9
  Downloading dogsheep_beta-0.9-py3-none-any.whl (10 kB)
Collecting yaml-to-sqlite~=0.3
  Downloading yaml_to_sqlite-0.3-py3-none-any.whl (7.5 kB)
Collecting healthkit-to-sqlite~=0.5
  Downloading healthkit_to_sqlite-0.5-py3-none-any.whl (9.3 kB)
ERROR: Cannot install sqlite-utils>=2.17, -r requirements.txt (line 25), -r requirements.txt (line 28), -r requirements.txt (line 38), -r requirements.txt (line 39) and -r requirements.txt (line 40) because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested sqlite-utils>=2.17
    datasette-init 0.2 depends on sqlite-utils
    dogsheep-beta 0.9 depends on sqlite-utils
    goodreads-to-sqlite 0.4 depends on sqlite-utils>=2.9
    yaml-to-sqlite 0.3 depends on sqlite-utils
    healthkit-to-sqlite 0.5 depends on sqlite-utils~=2.4.4

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies

I attempted to use the latest master branch but I'm not seeing any difference, pip still hangs when I try to run the command I originally posted. Maybe I'm not doing something right, but I tried this both in the standard python:3.7 docker image and natively on macos in a fresh virtualenv:

$ docker run --entrypoint=bash -it python:3.7
...
root@24eb69007fc3:/# git clone https://github.com/pypa/pip.git
Cloning into 'pip'...
...

root@24eb69007fc3:/# cd pip/
root@24eb69007fc3:/pip# pip install -e .
...
Successfully installed pip

root@24eb69007fc3:/pip# git branch -v
* master 00e531a16 Merge pull request #9017 from pradyunsg/backtracking-messaging

root@24eb69007fc3:/pip# pip list
Package    Version   Location
---------- --------- --------
pip        20.3.dev0 /pip/src
setuptools 50.3.2
wheel      0.35.1

root@24eb69007fc3:/pip# pip install --use-feature=2020-resolver "google-api-core>1.18.0,<1.21.0" "google-cloud-monitoring>=2.0.0"
Collecting google-api-core<1.21.0,>1.18.0
  Using cached google_api_core-1.20.1-py2.py3-none-any.whl (90 kB)
Requirement already satisfied: setuptools>=34.0.0 in /usr/local/lib/python3.7/site-packages (from google-api-core<1.21.0,>1.18.0) (50.3.2)
Collecting google-cloud-monitoring>=2.0.0
  Using cached google_cloud_monitoring-2.0.0-py2.py3-none-any.whl (287 kB)
Collecting pytz
  Using cached pytz-2020.1-py2.py3-none-any.whl (510 kB)
Collecting googleapis-common-protos<2.0dev,>=1.6.0
  Using cached googleapis_common_protos-1.52.0-py2.py3-none-any.whl (100 kB)
Collecting requests<3.0.0dev,>=2.18.0
  Using cached requests-2.24.0-py2.py3-none-any.whl (61 kB)
Collecting protobuf>=3.12.0
  Using cached protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl (1.3 MB)
Requirement already satisfied: setuptools>=34.0.0 in /usr/local/lib/python3.7/site-packages (from google-api-core<1.21.0,>1.18.0) (50.3.2)
Collecting six>=1.10.0
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting google-auth<2.0dev,>=1.14.0
  Using cached google_auth-1.22.1-py2.py3-none-any.whl (114 kB)
Requirement already satisfied: setuptools>=34.0.0 in /usr/local/lib/python3.7/site-packages (from google-api-core<1.21.0,>1.18.0) (50.3.2)
Collecting proto-plus>=1.4.0
  Using cached proto-plus-1.11.0.tar.gz (44 kB)
Collecting libcst>=0.2.5
  Using cached libcst-0.3.13-py3-none-any.whl (502 kB)
Collecting google-api-core[grpc]<2.0.0dev,>=1.22.2
  Using cached google_api_core-1.23.0-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.4-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.3-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.2-py2.py3-none-any.whl (91 kB)
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
Collecting libcst>=0.2.5
  Using cached libcst-0.3.12-py3-none-any.whl (501 kB)
  Using cached libcst-0.3.11-py3-none-any.whl (501 kB)
  Using cached libcst-0.3.10-py3-none-any.whl (498 kB)
  Using cached libcst-0.3.9-py3-none-any.whl (496 kB)
  Using cached libcst-0.3.8-py3-none-any.whl (488 kB)
  Using cached libcst-0.3.7-py3-none-any.whl (487 kB)
  Using cached libcst-0.3.6-py3-none-any.whl (481 kB)
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
  Using cached libcst-0.3.5-py3-none-any.whl (479 kB)
  Using cached libcst-0.3.4-py3-none-any.whl (476 kB)
  Using cached libcst-0.3.3-py3-none-any.whl (465 kB)
  Using cached libcst-0.3.2-py3-none-any.whl (460 kB)
  Using cached libcst-0.3.1-py3-none-any.whl (445 kB)
INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime.If you want to abort this run, you can press Ctrl + C to do so.To improve how pip performs, tell us what happened here: https://pip.pypa.io/surveys/backtracking
  Using cached libcst-0.3.0-py3-none-any.whl (433 kB)
  Using cached libcst-0.2.7-py3-none-any.whl (431 kB)
  Using cached libcst-0.2.6-py3-none-any.whl (430 kB)
  Using cached libcst-0.2.5-py3-none-any.whl (368 kB)
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime.If you want to abort this run, you can press Ctrl + C to do so.To improve how pip performs, tell us what happened here: https://pip.pypa.io/surveys/backtracking

and then it gets stuck. I let it sit for about 30 minutes before cancelling.

Also, it appears this is not limited to just 20.2.4. I was able to cause the same infinite loop issue in other versions of 20.2 (every release that has the 2020-resolver flag) with the following command (slightly different from the one I posted above):

pip install --use-feature=2020-resolver "apache-beam[gcp]==2.25.0" google-api-core==1.20.1

Thanks @DanSimon! I'm able to reproduce with the apache-beam[gcp] example (with a minor patch to improve logging of the resolver's actions):

$ pip install --use-feature=2020-resolver "apache-beam[gcp]==2.25.0" google-api-core==1.20.1
Collecting apache-beam[gcp]==2.25.0
  Using cached apache_beam-2.25.0-cp38-cp38-manylinux2010_x86_64.whl (10.3 MB)
Collecting google-api-core==1.20.1
  Using cached google_api_core-1.20.1-py2.py3-none-any.whl (90 kB)
Requirement already satisfied: setuptools>=34.0.0 in ./pythonenv3.8/lib/python3.8/site-packages (from google-api-core==1.20.1) (41.2.0)
Collecting numpy<2,>=1.14.3
  Using cached numpy-1.19.2-cp38-cp38-manylinux2010_x86_64.whl (14.5 MB)
Collecting future<1.0.0,>=0.18.2
  Using cached future-0.18.2.tar.gz (829 kB)
Collecting pymongo<4.0.0,>=3.8.0
  Using cached pymongo-3.11.0-cp38-cp38-manylinux2014_x86_64.whl (530 kB)
Collecting protobuf<4,>=3.12.2
  Using cached protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl (1.3 MB)
Requirement already satisfied: setuptools>=34.0.0 in ./pythonenv3.8/lib/python3.8/site-packages (from google-api-core==1.20.1) (41.2.0)
Collecting pydot<2,>=1.2.0
  Using cached pydot-1.4.1-py2.py3-none-any.whl (19 kB)
Collecting python-dateutil<3,>=2.8.0
  Using cached python_dateutil-2.8.1-py2.py3-none-any.whl (227 kB)
Collecting typing-extensions<3.8.0,>=3.7.0
  Using cached typing_extensions-3.7.4.3-py3-none-any.whl (22 kB)
Collecting pyarrow<0.18.0,>=0.15.1
  Using cached pyarrow-0.17.1-cp38-cp38-manylinux2014_x86_64.whl (63.8 MB)
Collecting httplib2<0.18.0,>=0.8
  Using cached httplib2-0.17.4-py3-none-any.whl (95 kB)
Collecting crcmod<2.0,>=1.7
  Using cached crcmod-1.7.tar.gz (89 kB)
Collecting mock<3.0.0,>=1.0.1
  Using cached mock-2.0.0-py2.py3-none-any.whl (56 kB)
Collecting hdfs<3.0.0,>=2.1.0
  Using cached hdfs-2.5.8.tar.gz (41 kB)
Collecting requests<3.0.0,>=2.24.0
  Using cached requests-2.24.0-py2.py3-none-any.whl (61 kB)
Collecting grpcio<2,>=1.29.0
  Using cached grpcio-1.33.2-cp38-cp38-manylinux2014_x86_64.whl (3.8 MB)
Collecting avro-python3!=1.9.2,<1.10.0,>=1.8.1
  Using cached avro-python3-1.9.2.1.tar.gz (37 kB)
Collecting dill<0.3.2,>=0.3.1.1
  Using cached dill-0.3.1.1.tar.gz (151 kB)
Collecting fastavro<2,>=0.21.4
  Using cached fastavro-1.0.0.post1-cp38-cp38-manylinux2014_x86_64.whl (1.7 MB)
Collecting pytz>=2018.3
  Using cached pytz-2020.1-py2.py3-none-any.whl (510 kB)
Collecting oauth2client<5,>=2.0.1
  Using cached oauth2client-4.1.3-py2.py3-none-any.whl (98 kB)
Collecting google-cloud-build<3,>=2.0.0
  Using cached google_cloud_build-2.0.0-py2.py3-none-any.whl (67 kB)
Collecting google-auth<2,>=1.18.0
  Using cached google_auth-1.22.1-py2.py3-none-any.whl (114 kB)
Requirement already satisfied: setuptools>=34.0.0 in ./pythonenv3.8/lib/python3.8/site-packages (from google-api-core==1.20.1) (41.2.0)
Collecting google-apitools<0.5.32,>=0.5.31
  Using cached google-apitools-0.5.31.tar.gz (173 kB)
Collecting google-cloud-spanner<2,>=1.13.0
  Using cached google_cloud_spanner-1.19.1-py2.py3-none-any.whl (255 kB)
Collecting google-cloud-dlp<2,>=0.12.0
  Using cached google_cloud_dlp-1.0.0-py2.py3-none-any.whl (169 kB)
Collecting grpcio-gcp<1,>=0.2.2
  Using cached grpcio_gcp-0.2.2-py2.py3-none-any.whl (9.4 kB)
Collecting google-cloud-language<2,>=1.3.0
  Using cached google_cloud_language-1.3.0-py2.py3-none-any.whl (83 kB)
Collecting google-cloud-core<2,>=0.28.1
  Using cached google_cloud_core-1.4.3-py2.py3-none-any.whl (27 kB)
Collecting google-cloud-videointelligence<2,>=1.8.0
  Using cached google_cloud_videointelligence-1.16.0-py2.py3-none-any.whl (183 kB)
Collecting google-cloud-datastore<2,>=1.7.1
  Using cached google_cloud_datastore-1.15.3-py2.py3-none-any.whl (134 kB)
Collecting cachetools<5,>=3.1.0
  Using cached cachetools-4.1.1-py3-none-any.whl (10 kB)
Collecting google-cloud-pubsub<2,>=0.39.0
  Using cached google_cloud_pubsub-1.7.0-py2.py3-none-any.whl (144 kB)
Collecting google-cloud-bigquery<2,>=1.6.0
  Using cached google_cloud_bigquery-1.28.0-py2.py3-none-any.whl (187 kB)
  Using cached google_cloud_bigquery-1.27.2-py2.py3-none-any.whl (172 kB)
  Using cached google_cloud_bigquery-1.26.1-py2.py3-none-any.whl (170 kB)
  Using cached google_cloud_bigquery-1.26.0-py2.py3-none-any.whl (170 kB)
  Using cached google_cloud_bigquery-1.25.0-py2.py3-none-any.whl (169 kB)
Collecting google-cloud-vision<2,>=0.38.0
  Using cached google_cloud_vision-1.0.0-py2.py3-none-any.whl (435 kB)
Collecting google-cloud-bigtable<2,>=0.31.1
  Using cached google_cloud_bigtable-1.5.1-py2.py3-none-any.whl (266 kB)
Collecting six>=1.10.0
  Using cached six-1.15.0-py2.py3-none-any.whl (10 kB)
Collecting googleapis-common-protos<2.0dev,>=1.6.0
  Using cached googleapis_common_protos-1.52.0-py2.py3-none-any.whl (100 kB)
Collecting pyparsing>=2.1.4
  Using cached pyparsing-2.4.7-py2.py3-none-any.whl (67 kB)
Collecting pbr>=0.11
  Using cached pbr-5.5.1-py2.py3-none-any.whl (106 kB)
Collecting docopt
  Using cached docopt-0.6.2.tar.gz (25 kB)
Collecting certifi>=2017.4.17
  Using cached certifi-2020.6.20-py2.py3-none-any.whl (156 kB)
Collecting chardet<4,>=3.0.2
  Using cached chardet-3.0.4-py2.py3-none-any.whl (133 kB)
Collecting urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1
  Using cached urllib3-1.25.11-py2.py3-none-any.whl (127 kB)
Collecting idna<3,>=2.5
  Using cached idna-2.10-py2.py3-none-any.whl (58 kB)
Collecting pyasn1-modules>=0.0.5
  Using cached pyasn1_modules-0.2.8-py2.py3-none-any.whl (155 kB)
Collecting rsa>=3.1.4
  Using cached rsa-4.6-py3-none-any.whl (47 kB)
Collecting pyasn1>=0.1.7
  Using cached pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
Collecting google-api-core[grpc]<2.0.0dev,>=1.22.0
  Using cached google_api_core-1.23.0-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.4-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.3-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.2-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.1-py2.py3-none-any.whl (91 kB)
  Using cached google_api_core-1.22.0-py2.py3-none-any.whl (91 kB)
Backtracking pyasn1 0.4.8 LinkCandidate
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
Collecting pyasn1>=0.1.7
  Downloading pyasn1-0.4.7-py2.py3-none-any.whl (76 kB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 76 kB 2.7 MB/s 
Backtracking pyasn1 0.4.7 LinkCandidate
  Downloading pyasn1-0.4.6-py2.py3-none-any.whl (75 kB)
     |β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ| 75 kB 2.5 MB/s 
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime.If you want to abort this run, you can press Ctrl + C to do so.To improve how pip performs, tell us what happened here: https://pip.pypa.io/surveys/backtracking
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
INFO: pip is looking at multiple versions of this package to determine which version is compatible with other requirements. This could take a while.
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
INFO: This is taking longer than usual. You might need to provide the dependency resolver with stricter constraints to reduce runtime.If you want to abort this run, you can press Ctrl + C to do so.To improve how pip performs, tell us what happened here: https://pip.pypa.io/surveys/backtracking
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate
Backtracking pyasn1 0.4.7 LinkCandidate
Backtracking pyasn1 0.4.6 LinkCandidate
Backtracking rsa 4.6 LinkCandidate

I think I’ve identified the problem. Fix submitted in sarugaku/resolvelib#60, where I also described my understanding to the problem.

@uranusjr I think I have an inhouse way of reproducing this issue.

How can I test your PR? I am not sure how resolvelib integrates into pip...

@romaingz I’m working on a PR to pip to pull in the changes for people to test.

I’ve pushed a patched pip to my fork. You can test with

python -m pip install -U https://github.com/uranusjr/pip/archive/resolvelib-dev.zip

I can generate this error message from the above apache-beam[gcp] + google-api-core example:

ERROR: Cannot install apache-beam, apache-beam, apache-beam, apache-beam, apache-beam, apache-beam,
apache-beam, apache-beam, apache-beam, apache-beam, apache-beam, apache-beam, google-api-core==1.20.1,
google-api-core==1.20.1, google-api-core==1.20.1, google-api-core==1.20.1, google-api-core==1.20.1,
google-api-core==1.20.1, google-api-core[grpc] 1.22.0, google-api-core[grpc] 1.22.1,
google-api-core[grpc] 1.22.2, google-api-core[grpc] 1.22.3, google-api-core[grpc] 1.22.4 and
google-api-core[grpc] 1.23.0 because these package versions have conflicting dependencies.
ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies

(See #8495 for discussions on improving the message, let’s leave that for now.)

However, I found that the error message is not consistent, because the ordering the resolver tries requirements is not deterministic. And I can’t generate an infinite resolution if I add a deterministic ordering (and remove the fix) 😞

So what was failing all day yesterday stopped failing today (without @uranusjr 's patch).

Is there a seed that I could retrieve from a failed attempt and reuse on others attempt in order to keep consistent results?

Is there a seed that I could retrieve from a failed attempt and reuse on others attempt in order to keep consistent results?

I don't think so -- it's likely dependent on the hash randomisation that Python does (since the sorting order logic was giving multiple items with same key, and that's fixed in #9100).

This issue bit me today on the cheroot project. I checked out cherrypy/cheroot@5de9b053, set PIP_USE_FEATURE=2020-resolver, and ran tox and it appeared to hang. I cancelled it, cleaned, and restarted with tox -vvv and I could see messages whizzing by about installing pytest and coverage (among other things). Clearing the feature flag and the tests run as expected. The pip version that tox installs is 20.2.3 (though 20.2.4 is available). I haven't yet had a chance to investigate further.

In https://github.com/cherrypy/cheroot/tree/pypa-9011, I've committed two commits, one which replicates the issue and another which applies the proposed fix. It does seem that after applying the proposed fix, the code no longer hangs but now detects a conflict. That indicates to me that the fix does in fact address the issue.

Hmm. Maybe I spoke too soon. I'm noticing that some of the builds of that branch failed fast (~90s) but other builds continue to run (~20m). On my local workstation, some runs hang while others complete.

You’re probably also affected by the undeterminisic issue (fixed in #9100). Can you try if you’re able to reproduce the hang issue with master (which I believe should consistently either fail or succeed)?

Confirmed - running under pip master causes the tests to hang reliably.

Thanks! I’ve managed to limit the problematic requirement set to

pytest-mock>=1.11.0
pytest-sugar>=0.9.3
pytest-testmon<1.0.0
coverage==5.3

Removing any one of these and the resolver would be able to produce a solution. I’ll try to build a test case and work from there (hopefully during the week).


Note (to self): My current hypothesis is this issue can be triggered if the resolver sees more than one unrelated conflicts. It would see one, backtrack for that, see the other one, backtrack for that, and hit the first one again.

It worth mentioning that I think this bugs may have something to do with extras and mentioning pre-releases in requirements. At this this is what happened in my case when I ended up with endless loop between a package and a package-plugin. I was able to workaround it by avoiding pre-releases, which is recommended also but I am afraid that I encountered this bug at least 3 times over the last 3 months and only once it was... in my garden.

Folks here may be interested in this update.

This is now one of the two major blockers to releasing pip 20.3, just FYI for folks reading.

Update: A fix for this was put together. pip 20.3 (which should include the fix) will likely happen soon, but I have updated my fork (mentioned in this comment) to include it. Feel free to try it out and report whether it indeed solves the issue!

This "resolvelib-dev" proposed patch solves my own infinite resolution case https://github.com/pypa/pip/issues/9112#issuecomment-735222069

I'm getting an infinite loop trying to install the following requirements.txt with pip==20.3 into a fresh venv, python version 3.8.5 on Mac:

tensorboard==2.2.2
torch==1.7.0
tqdm>=4.54

nltk==3.5.0
transformers==3.5.0
tokenizers==0.9.4
jsonlines>=1.2
sacrebleu>=1.4

pytest>=6.1
pytest-cov>=2.10
codecov>=2.1
flake8>=3.8
black==20.8b1

The install eventually gets stuck in a loop, with following output repeated:

Requirement already satisfied: typing-extensions>=3.7.4 in ./testenv/lib/python3.8/site-packages (from black==20.8b1->-r requirements.txt (line 15)) (3.7.4.3)
Requirement already satisfied: regex>=2020.1.8 in ./testenv/lib/python3.8/site-packages (from black==20.8b1->-r requirements.txt (line 15)) (2020.11.13)
Requirement already satisfied: setuptools>=41.0.0 in ./testenv/lib/python3.8/site-packages (from tensorboard==2.2.2->-r requirements.txt (line 1)) (44.0.0)

Output from 20.2.4 with --use-feature=2020-resolver enabled:

ERROR: Cannot install tokenizers==0.9.4 and transformers 3.5.0 because these package versions have conflicting dependencies.

.. but the install does terminate.

Edit: fixing the conflict by requiring transformers==4.0.0 installs OK.

Reopening.

Running into this as well.

Here is requirements file that reproduces it for me using pip 20.3
pip --version pip 20.3 from /home/elijah/venvs/pipresolve/lib64/python3.8/site-packages/pip (python 3.8)

boto
boto3
botocore
cryptography
elasticsearch
gcloud
google-api-python-client
junit-xml
junit2html
junitparser
kubernetes>=8.0.0,<9.0.0
openshift==0.8.9

With 20.2.4, the installation does have the error:
openshift 0.8.9 requires urllib3<1.25, but you'll have urllib3 1.26.2 which is incompatible. but the installation does complete

@tomhosking’s case eventually gives me

ERROR: Cannot install -r r.txt (line 6) and tokenizers==0.9.4 because these package versions have conflicting dependencies.

The conflict is caused by:
    The user requested tokenizers==0.9.4
    transformers 3.5.0 depends on tokenizers==0.9.3

To fix this you could try to:
1. loosen the range of package versions you've specified
2. remove package versions to allow pip attempt to solve the dependency conflict

ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/user_guide/#fixing-conflicting-dependencies

I have not finished the second one, but expect it to also result in an eventual error judging by the output.

In both cases, the output seems stuck since they repetitively showed the same packages over and over again. But when inspected closely, the resolver very occassionally spit out different things, indicating progress.

@tomhosking’s example:

  Downloading codecov-2.1.5-py2.py3-none-any.whl (16 kB)
(a ton of setuptools and wheel lines)
  Downloading codecov-2.1.4-py2.py3-none-any.whl (16 kB)
(a ton of setuptools and wheel lines)
  Downloading codecov-2.1.3.tar.gz (18 kB)
(goes on and on)

@kdelee’s example:

  Using cached junit-xml-1.8.tar.gz (10.0 kB)
(a ton of setuptools lines)
  Using cached junit-xml-1.7.tar.gz (9.1 kB)
(a ton of setuptools lines)
  Downloading junit-xml-1.6.tar.gz (9.1 kB)
(...)

So I don’t think there is a logical error in the resolver, only that pip’s output isn’t doing a good job expressing how it’s trying (very slightly) different things.

@kdelee’s example:
So I don’t think there is a logical error in the resolver, only that pip’s output isn’t doing a good job expressing how it’s trying (very slightly) different things.

That is believable, so while this may not be a case of "infinite" recursion, it is still trying out finitely more than I can wait around for (currently have a job thats been running for over 3 hours looping in the pip install.) and does not really tell me whats wrong. Sounds like https://github.com/pypa/pip/issues/9185 is a good idea

Thanks for checking @uranusjr! A bit like @kdelee, I found this because a CI workflow timed out. Some way of failing faster or with less excessive output would be great :)

The reports coming in at this time are different from what this was originally for (and what it tracked as a release blocker for 20.3).

I'm gonna close this in favor of #9187, since I'd like to keep 20.2.4 vs 20.3 reports in separate issues.

Was this page helpful?
0 / 5 - 0 ratings