Note: I initially reported this here https://github.com/pypa/setuptools/issues/1247, but was advised to report it here instead.
A similar issue was reported and fixed here for pip.
In our case:
zulip_bots package that depends on requests and simple_salesforce. simple_salesforce further depends on requests[security].zulip_bots package also depends on the zulip package in the same repo which also depends on/installs requests. So, it is clear that requests does get installed whether you install zulip or zulip_bots.zulip and zulip_bots packages.zulip_bots package), we ran into:.py
pkg_resources.DistributionNotFound: The 'cryptography>=1.3.4; extra == "security"' distribution was not found and is required by requests
The above error led us to conclude that for some reason, requests[security] was not getting satisfied as expected.
It would mean a lot to us if someone could please shed some light on whether this is a re-manifestation of https://github.com/pypa/pip/issues/3189 and https://github.com/pypa/pip/pull/3198 or simply a quirk in our understanding of how extra dependencies are resolved! Thanks! :)
I think I have a similar case. Reproduction is as follows. If I have a requirements.txt file like:
git+https://gitlab.com/datadrivendiscovery/[email protected]
scikit-learn
and I do:
pip install --process-dependency-links -r requirements.txt
(--process-dependency-links has nothing with this report, this is just because the package I am demonstrating with requires it)
Then scipy is not installed, despite being and extra dependency alldeps in scikit-learn[alldeps] from d3m_metadata package (installed from the git repo above). scipy installs correctly if there is no scikit-learn entry in requirements.txt. It seems extras do not get combined as one would expect. This is really tricky because one cannot really know all dependencies packages can have. So If in my project I need d3m_metadata package and just basic scikit-learn, I would like to list only those. But now what happens i that d3m_metadata package does not get all expected dependencies and it fails.
I am having the following problem (commented on #3516). Is this issue the cause of that problem?
I am also still having this problem in Pip 9.0.3 and 10.0.1. I'll provide a specific example. PySOA provides a PyTest plugin, and that plugin has a set of requirements, represented in the extra
pysoa[pytest]. Projects that use PySOA would putpysoain their normal requirements (so that the PyTest plugin extras aren't included in the distribution), but would putpysoa[pytest]in theirtestingextras so that the PyTest plugin extras are installed for testing:install_requires={ ... 'pysoa' ...}, tests_require={ ... 'pysoa[pytest]' ... }, extras_require={ 'testing': { ... 'pysoa[pytest]' ...}, },In our CI environment, when we run
python setup.py test, it works perfectly. Thepysoa[pytest]requirement, with extras, is installed, and tests pass. However, locally, we install it withpip install -e .[testing], and that approach does not install the extras frompysoa[pytest], so our tests fail locally unless we manually install the extra requirements.
Same issue here 馃槥
Extract from my setup.py:
extras_require = {
'api': [
'Some-Dep[api]'
],
},
install_requires = [
'Some-Dep',
],
pip install --editable ".[api]" does not install the extra dependencies api of Some-Dep.
This just bit us as well. I've run a few test cases:
$ pip install 'requests[security]' 'requests' # installs `requests[security]`
$ pip install 'requests' 'requests[security]' # BUG: only installs `requests`
$ pip install 'requests' 'requests[security]' && pip install 'requests[security]' # BUG: only installs `requests`, then installs `requests[security]` in the second command
$ pip install 'requests[security]' 'requests[socks]' # BUG: only installs `requests[security]`
$ pip install 'requests[socks]' 'requests[security]' # BUG: only installs `requests[socks]`
This bug also applies to setup.py dependencies, even if the local setup.py is not itself making use of extras:
$ cat setup.py
import setuptools; setuptools.setup(
name='test-0', version='1.0.0', description='test 0',
author='me', author_email='[email protected]', url='https://domain.tld',
packages=[],
install_requires=['requests[security]'])
$ pip install . # installs `requests[security]`
$ pip install requests . # BUG: only installs `requests` (and `test-0`)
The above test cases have been replicated on:
pip install pip==8.0.0)And versions of pip prior to 8.0.0 raise an error when passing requirements with two different extras, as described in #3189.
After going through this exercise, It seems clear to me that #3189 as well as its associated PR #3198 solve only a small portion of this issue, namely running rather than erroring out. It is worth noting that #988 "build a dependency resolver" is still open and describes the above issues quite clearly in point 2:
a. "first found, wins" (where the order is breadth first)
Given the above, I'm pretty sure this boils down to #988, #4957, etc, and many other bugs on various other repos (eg. GoogleCloudPlatform/google-cloud-python#5023, GoogleCloudPlatform/google-cloud-python#5776) all being dupes of this.
I'm seeing this same issue with pip version 19.1 as well. As an example, if I have two extras specified, prod and test, with extras_require that look something like the following:
setup(
[...],
extras_require={
'prod': ['foo'],
'test': ['foo[bar]'],
},
)
then I can verify that both pip install .[prod,test] and pip install .[test,prod] will install foo but fail to install it with extras as foo[bar].
I don't have a good solution for the case when two extras specify the same package but with different extras (e.g. for the above example, if test were to require foo[bar] and prod required foo[baz]) other than either merging all of the specified extras together and requiring all of them (e.g. foo[bar,baz]), or simply raising an exception because of the conflict, but either would be better than the current behavior of silent failure.
Hi, maybe you can try a dependency diagnosis website http://www.watchman-pypi.com/dependency_analysis, which can help diagnoze dependency conflict problems and automatically visualize your full dependency tree and those of your downstream projects.
Best,
Neolith
any updates?
I believe the 2020 resolver does this correctly. Can anyone confirm?
I'm seeing the same issue with pip 20.2.1.
And I can confirm using pip --use-feature 2020-resolver does solve the issue for me.
Thanks for the confirmation. I鈥檒l merge this into the #988 mega issue then.
Most helpful comment
any updates?