Pipenv: Pipenv fails to resolve subdependency when viable solution exists

Created on 17 Jul 2018  ·  42Comments  ·  Source: pypa/pipenv

This is being worked on here: https://github.com/sarugaku/passa

Issue description

You have two projects:

.
├── base-proj
│   ├── Pipfile
│   └── Pipfile.lock
└── sub-package
    └── setup.py

2 directories, 3 files

The setup.py looks like this:

from setuptools import setup

setup(
    name='sub-package',
    version='0.1',
    install_requires=['tensorflow'],
)

And the Pipfile:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
tensorflow = "==1.8.0"

[dev-packages]

[requires]
python_version = "3.6"

From the base-proj directory, when you run pipenv install -e ../sub-package/, you get the following output:

Adding -e ../sub-package/ to Pipfile's [packages]...
Pipfile.lock (f43471) out of date, updating to (9beaad)...
Locking [dev-packages] dependencies...
Locking [packages] dependencies...
 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.6.0rc0, 1.6.0rc0
There are incompatible versions in the resolved dependencies.
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
  Hint: try $ pipenv lock --pre if it is a pre-release dependency.
Could not find a version that matches tensorboard<1.10.0,<1.9.0,>=1.8.0,>=1.9.0
Tried: 1.6.0, 1.6.0, 1.7.0, 1.7.0, 1.8.0, 1.8.0, 1.9.0, 1.9.0
Skipped pre-versions: 1.0.0a0, 1.0.0a0, 1.0.0a1, 1.0.0a1, 1.0.0a2, 1.0.0a2, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.6.0rc0, 1.6.0rc0
There are incompatible versions in the resolved dependencies.

How can Pipenv resolve tensorboard to '<1.10.0,<1.9.0,>=1.8.0,>=1.9.0'? It seems it is somehow pulling in the dependency tensorboard of tensorflow==1.9.0 and 1.8.0, and combining them.

Expected result

The tensorflow dependency lock in the main project seems to conflict with the one defined in the setup.py. Specifically the tensorboard sub-dependency seems to become immediately unsolvable (see lock --verbose output below).

Actual result

After running pipenv lock --verbose:

Locking [dev-packages] dependencies...
Locking [packages] dependencies...
using sources: [{'url': 'https://pypi.org/simple', 'verify_ssl': True, 'name': 'pypi'}]
Using pip: -i https://pypi.org/simple

                          ROUND 1                           
Current constraints:
  file:///Users/tom/projects/pipenv-test/sub-package (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-lxr0x3iq-constraints.txt (line 3))
  tensorflow==1.8.0 (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-lxr0x3iq-constraints.txt (line 2))

Finding the best candidates:
  found candidate -e file:///Users/tom/projects/pipenv-test/sub-package (constraint was <any>)
  found candidate tensorflow==1.8.0 (constraint was ==1.8.0)

Finding secondary dependencies:
  tensorflow==1.8.0         requires absl-py>=0.1.6, astor>=0.6.0, bleach==1.5.0, gast>=0.2.0, grpcio>=1.8.6, html5lib==0.9999999, markdown>=2.6.8, numpy>=1.13.3, protobuf>=3.4.0, setuptools, six>=1.10.0, tensorboard<1.9.0,>=1.8.0, tensorflow==1.8.0, termcolor>=1.1.0, werkzeug>=0.11.10, wheel>=0.26

New dependencies found in this round:
  adding ['absl-py', '>=0.1.6', '[]']
  adding ['astor', '>=0.6.0', '[]']
  adding ['bleach', '==1.5.0', '[]']
  adding ['gast', '>=0.2.0', '[]']
  adding ['grpcio', '>=1.8.6', '[]']
  adding ['html5lib', '==0.9999999', '[]']
  adding ['markdown', '>=2.6.8', '[]']
  adding ['numpy', '>=1.13.3', '[]']
  adding ['protobuf', '>=3.4.0', '[]']
  adding ['six', '>=1.10.0', '[]']
  adding ['sub-package', '==0.1', '[]']
  adding ['tensorboard', '<1.10.0,<1.9.0,>=1.8.0,>=1.9.0', '[]']
  adding ['tensorflow', '==1.8.0', '[]']
  adding ['termcolor', '>=1.1.0', '[]']
  adding ['werkzeug', '>=0.11.10', '[]']
  adding ['wheel', '>=0.26', '[]']
Removed dependencies in this round:
Unsafe dependencies in this round:
------------------------------------------------------------
Result of round 1: not stable

                          ROUND 2                           
Current constraints:
  absl-py>=0.1.6
  astor>=0.6.0
  bleach==1.5.0
  gast>=0.2.0
  grpcio>=1.8.6
  html5lib==0.9999999
  markdown>=2.6.8
  numpy>=1.13.3
  protobuf>=3.4.0
  six>=1.10.0
  sub-package==0.1 from file:///Users/tom/projects/pipenv-test/sub-package (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-lxr0x3iq-constraints.txt (line 3))
  tensorboard<1.10.0,<1.9.0,>=1.8.0,>=1.9.0
  tensorflow==1.8.0 (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-lxr0x3iq-constraints.txt (line 2))
  termcolor>=1.1.0
  werkzeug>=0.11.10
  wheel>=0.26

Finding the best candidates:
  found candidate absl-py==0.2.2 (constraint was >=0.1.6)
  found candidate astor==0.7.1 (constraint was >=0.6.0)
  found candidate bleach==1.5.0 (constraint was ==1.5.0)
  found candidate gast==0.2.0 (constraint was >=0.2.0)
  found candidate grpcio==1.13.0 (constraint was >=1.8.6)
  found candidate html5lib==0.9999999 (constraint was ==0.9999999)
  found candidate markdown==2.6.11 (constraint was >=2.6.8)
  found candidate numpy==1.14.5 (constraint was >=1.13.3)
  found candidate protobuf==3.6.0 (constraint was >=3.4.0)
  found candidate six==1.11.0 (constraint was >=1.10.0)
  found candidate -e file:///Users/tom/projects/pipenv-test/sub-package (constraint was ==0.1)
Using pip: -i https://pypi.org/simple

                          ROUND 1                           
Current constraints:
  file:///Users/tom/projects/pipenv-test/sub-package (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-f2vkysg2-constraints.txt (line 3))
  tensorflow==1.8.0 (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-f2vkysg2-constraints.txt (line 2))

Finding the best candidates:
  found candidate -e file:///Users/tom/projects/pipenv-test/sub-package (constraint was <any>)
  found candidate tensorflow==1.8.0 (constraint was ==1.8.0)

Finding secondary dependencies:
  tensorflow==1.8.0         requires absl-py>=0.1.6, astor>=0.6.0, bleach==1.5.0, gast>=0.2.0, grpcio>=1.8.6, html5lib==0.9999999, markdown>=2.6.8, numpy>=1.13.3, protobuf>=3.4.0, setuptools, six>=1.10.0, tensorboard<1.9.0,>=1.8.0, tensorflow==1.8.0, termcolor>=1.1.0, werkzeug>=0.11.10, wheel>=0.26

New dependencies found in this round:
  adding ['absl-py', '>=0.1.6', '[]']
  adding ['astor', '>=0.6.0', '[]']
  adding ['bleach', '==1.5.0', '[]']
  adding ['gast', '>=0.2.0', '[]']
  adding ['grpcio', '>=1.8.6', '[]']
  adding ['html5lib', '==0.9999999', '[]']
  adding ['markdown', '>=2.6.8', '[]']
  adding ['numpy', '>=1.13.3', '[]']
  adding ['protobuf', '>=3.4.0', '[]']
  adding ['six', '>=1.10.0', '[]']
  adding ['sub-package', '==0.1', '[]']
  adding ['tensorboard', '<1.10.0,<1.9.0,>=1.8.0,>=1.9.0', '[]']
  adding ['tensorflow', '==1.8.0', '[]']
  adding ['termcolor', '>=1.1.0', '[]']
  adding ['werkzeug', '>=0.11.10', '[]']
  adding ['wheel', '>=0.26', '[]']
Removed dependencies in this round:
Unsafe dependencies in this round:
------------------------------------------------------------
Result of round 1: not stable

                          ROUND 2                           
Current constraints:
  absl-py>=0.1.6
  astor>=0.6.0
  bleach==1.5.0
  gast>=0.2.0
  grpcio>=1.8.6
  html5lib==0.9999999
  markdown>=2.6.8
  numpy>=1.13.3
  protobuf>=3.4.0
  six>=1.10.0
  sub-package==0.1 from file:///Users/tom/projects/pipenv-test/sub-package (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-f2vkysg2-constraints.txt (line 3))
  tensorboard<1.10.0,<1.9.0,>=1.8.0,>=1.9.0
  tensorflow==1.8.0 (from -r /var/folders/9w/twrv54nd0v19gsbjhjs3mlhc0000gn/T/pipenv-btuknzld-requirements/pipenv-f2vkysg2-constraints.txt (line 2))
  termcolor>=1.1.0
  werkzeug>=0.11.10
  wheel>=0.26

Finding the best candidates:
  found candidate absl-py==0.2.2 (constraint was >=0.1.6)
  found candidate astor==0.7.1 (constraint was >=0.6.0)
  found candidate bleach==1.5.0 (constraint was ==1.5.0)
  found candidate gast==0.2.0 (constraint was >=0.2.0)
  found candidate grpcio==1.13.0 (constraint was >=1.8.6)
  found candidate html5lib==0.9999999 (constraint was ==0.9999999)
  found candidate markdown==2.6.11 (constraint was >=2.6.8)
  found candidate numpy==1.14.5 (constraint was >=1.13.3)
  found candidate protobuf==3.6.0 (constraint was >=3.4.0)
  found candidate six==1.11.0 (constraint was >=1.10.0)
  found candidate -e file:///Users/tom/projects/pipenv-test/sub-package (constraint was ==0.1)

Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
  Hint: try $ pipenv lock --pre if it is a pre-release dependency.
Could not find a version that matches tensorboard<1.10.0,<1.9.0,>=1.8.0,>=1.9.0
Tried: 1.6.0, 1.6.0, 1.7.0, 1.7.0, 1.8.0, 1.8.0, 1.9.0, 1.9.0
Skipped pre-versions: 1.0.0a0, 1.0.0a0, 1.0.0a1, 1.0.0a1, 1.0.0a2, 1.0.0a2, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.6.0rc0, 1.6.0rc0
There are incompatible versions in the resolved dependencies.
Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
  Hint: try $ pipenv lock --pre if it is a pre-release dependency.
Could not find a version that matches tensorboard<1.10.0,<1.9.0,>=1.8.0,>=1.9.0
Tried: 1.6.0, 1.6.0, 1.7.0, 1.7.0, 1.8.0, 1.8.0, 1.9.0, 1.9.0
Skipped pre-versions: 1.0.0a0, 1.0.0a0, 1.0.0a1, 1.0.0a1, 1.0.0a2, 1.0.0a2, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a3, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a4, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a5, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.0.0a6, 1.6.0rc0, 1.6.0rc0
There are incompatible versions in the resolved dependencies.
Steps to replicate

Provide the steps to replicate (which usually at least includes the commands and the Pipfile).


$ pipenv --support

Pipenv version: '2018.7.1'

Pipenv location: '/usr/local/Cellar/pipenv/2018.7.1/libexec/lib/python3.7/site-packages/pipenv'

Python location: '/usr/local/Cellar/pipenv/2018.7.1/libexec/bin/python3.7'

Other Python installations in PATH:

  • 2.7: /usr/local/bin/python2.7
  • 2.7: /usr/local/bin/python2.7
  • 2.7: /usr/bin/python2.7
  • 3.6: /Users/tom/.pyenv/shims/python3.6m
  • 3.6: /Users/tom/.local/share/virtualenvs/base-proj-lBpX7WJ2/bin/python3.6
  • 3.6: /Users/tom/.pyenv/shims/python3.6
  • 3.6: /Users/tom/.pyenv/shims/python3.6
  • 3.7: /usr/local/bin/python3.7m
  • 3.7: /usr/local/bin/python3.7

  • 3.6.5: /Users/tom/.local/share/virtualenvs/base-proj-lBpX7WJ2/bin/python

  • 3.6.5: /Users/tom/.pyenv/shims/python
  • 3.6.5: /Users/tom/.pyenv/shims/python
  • 2.7.15: /usr/local/bin/python
  • 2.7.10: /usr/bin/python
  • 2.7.15: /usr/local/bin/python2
  • 3.6.5: /Users/tom/.local/share/virtualenvs/base-proj-lBpX7WJ2/bin/python3
  • 3.6.5: /Users/tom/.pyenv/shims/python3
  • 3.6.5: /Users/tom/.pyenv/shims/python3
  • 3.7.0: /usr/local/bin/python3

PEP 508 Information:

{'implementation_name': 'cpython',
 'implementation_version': '3.7.0',
 'os_name': 'posix',
 'platform_machine': 'x86_64',
 'platform_python_implementation': 'CPython',
 'platform_release': '17.7.0',
 'platform_system': 'Darwin',
 'platform_version': 'Darwin Kernel Version 17.7.0: Thu Jun 21 22:53:14 PDT '
                     '2018; root:xnu-4570.71.2~1/RELEASE_X86_64',
 'python_full_version': '3.7.0',
 'python_version': '3.7',
 'sys_platform': 'darwin'}

System environment variables:

  • PATH
  • TERM_PROGRAM
  • TERM
  • SHELL
  • PIP_PYTHON_PATH
  • OP_entry_name
  • TMPDIR
  • OL_client_secret
  • Apple_PubSub_Socket_Render
  • TERM_PROGRAM_VERSION
  • OP_SESSION
  • HOMEBREW_AUTO_UPDATE_SECS
  • TERM_SESSION_ID
  • LC_ALL
  • USER
  • ONFIDO_ROLE
  • SSH_AUTH_SOCK
  • __CF_USER_TEXT_ENCODING
  • nvm_prefix
  • VIRTUAL_ENV_DISABLE_PROMPT
  • VIRTUAL_ENV
  • PIPENV_ACTIVE
  • PWD
  • OL_client_id
  • EDITOR
  • LANG
  • ITERM_PROFILE
  • XPC_FLAGS
  • OL_region
  • PYTHONDONTWRITEBYTECODE
  • XPC_SERVICE_NAME
  • SHLVL
  • PYENV_SHELL
  • HOME
  • COLORFGBG
  • ITERM_SESSION_ID
  • LOGNAME
  • _OLD_VIRTUAL_PATH
  • LC_CTYPE
  • OL_username
  • __pipenv_fish_initial_pwd
  • COLORTERM

Pipenv–specific environment variables:

  • PIPENV_ACTIVE: 1

Debug–specific environment variables:

  • PATH: /usr/local/Cellar/pipenv/2018.7.1/libexec/tools:/Users/tom/.local/share/virtualenvs/base-proj-lBpX7WJ2/bin:/Users/tom/.pyenv/shims:/usr/local/Cellar/pipenv/2018.7.1/libexec/tools:/Users/tom/.pyenv/shims:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Mono.framework/Versions/Current/Commands:/Applications/Wireshark.app/Contents/MacOS
  • SHELL: /usr/local/bin/fish
  • EDITOR: nano
  • LANG: en_US.UTF-8
  • PWD: /Users/tom/projects/pipenv-test/base-proj
  • VIRTUAL_ENV: /Users/tom/.local/share/virtualenvs/base-proj-lBpX7WJ2

Contents of Pipfile ('/Users/tom/projects/pipenv-test/base-proj/Pipfile'):

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
tensorflow = "==1.8.0"
sub-package = {editable = true, path = "./../sub-package"}

[dev-packages]

[requires]
python_version = "3.6"

Contents of Pipfile.lock ('/Users/tom/projects/pipenv-test/base-proj/Pipfile.lock'):

{
    "_meta": {
        "hash": {
            "sha256": "d9be781a0c99deda926abe1f0ad149d718c738ffe906d002d6f79bf053edb66f"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "absl-py": {
            "hashes": [
                "sha256:e0eb8358b549552b1cc5972350bc3e41dd0a926c15b3ff95ce60f3c78c80824c"
            ],
            "version": "==0.2.2"
        },
        "astor": {
            "hashes": [
                "sha256:95c30d87a6c2cf89aa628b87398466840f0ad8652f88eb173125a6df8533fb8d",
                "sha256:fb503b9e2fdd05609fbf557b916b4a7824171203701660f0c55bbf5a7a68713e"
            ],
            "markers": "python_version != '3.0.*' and python_version != '3.3.*' and python_version != '3.2.*' and python_version != '3.1.*' and python_version >= '2.7'",
            "version": "==0.7.1"
        },
        "bleach": {
            "hashes": [
                "sha256:978e758599b54cd3caa2e160d74102879b230ea8dc93871d0783721eef58bc65",
                "sha256:e67f46adcec78dbc3c04462f3aba3213a673d5652eba2609ed1ef15492a44b8d"
            ],
            "version": "==1.5.0"
        },
        "gast": {
            "hashes": [
                "sha256:7068908321ecd2774f145193c4b34a11305bd104b4551b09273dfd1d6a374930"
            ],
            "version": "==0.2.0"
        },
        "grpcio": {
            "hashes": [
                "sha256:002f9170d8c0c10c33f643240c2332ce6eb8c8cc8c2b08d6a8f3172ef574751b",
                "sha256:0f80b28033105e99e08d84361b899c45bd6eb31d2765ff2ed7cb66b8b1d12820",
                "sha256:1012969abbec9a6c5d7b09ac829df296cb0a2ddebe70dd314abb881fa62cbcc9",
                "sha256:19af04506fec213de9a889343d4b090e9d0b675e1d9b8397ea6fc6521f939a48",
                "sha256:37cdffc26987ae2a077cc80fc0d87273e0e01ba15df40ec0a20d107e635700cf",
                "sha256:4e72b30a276e519d687dc53d86ecf9d65edf31dad473f3bbd041542bbf9df12f",
                "sha256:564499d84c2e90eb87819f7a299eaa2aee32db8208a8e8d00e8941a0c66413c0",
                "sha256:6324581e215157f0fbe335dff2e21a65b4406db98ac7cca05f1e23b4f510b426",
                "sha256:64758d2718f14792286b32d31560edb10c3726ce5d5875c3472c95908b658aeb",
                "sha256:67b36c6b0070ef858e5438e82d3a3fb19db33a174572019744d7b965c95fa9b0",
                "sha256:83766cdfc3492a693902eff193648b3cc9710e4a131815cd0cc60e30e9b7cf8f",
                "sha256:935a0b328b79e03a47d87960836513bab1150d0faab44aff7968f8623ed48d62",
                "sha256:982349cc24df7569ab955bafa3ba7575140db171c3bd757fa135d0c0c0d6990d",
                "sha256:9c79eaca4b0b8fb973c6e0c4c6cd4be44e76dfd09d56cfc7b2a959289fda6682",
                "sha256:9efcdfe1cc1670dde940f86e51fe080184f637106cf9b6d8dfc14cab9660d710",
                "sha256:a24a37e441c36d6605029cfb035806ef4f888a37d757e64fb0488d03c3fff806",
                "sha256:ab33b5965df89fd6e4ea7846cb9a28ece4e6d9ded23434d3321b992051a62de0",
                "sha256:ad6c12e9ab809fd4f8891a085a7655ca2690a5753bb6258d9d602084f610a223",
                "sha256:b1e4c83209bce5548029ed7df2af6a94415bb7dd37a2203183919d1d5a5249c9",
                "sha256:b87cdf8c4291875bda4b2a0f6747cab008fd9ea6c682a43d0869d308a16d0956",
                "sha256:b9e3793e0d1498e5c72993ba91f14e617e06e945d6562716bfbbbc6a9e7ab7de",
                "sha256:ba388412f64d6ac02098fcb77c409896297b058a8942d946bd1999699d35c123",
                "sha256:baaf1a0d5a5d9af67ec3ff0d9dfc1d642e7aba38e59ae60de1c6d1bd46406177",
                "sha256:be0d79c3253f7d23facc4dab96ada086e9b17048a36843041a5fac3bad9415e7",
                "sha256:ce3c23b1110238c1f440cdbceefd0c5fc7fcf3022c82c8a349514038aa69ac3d",
                "sha256:d9b9d309e7db3a988df0d12ba3c1ca4a7059c502c10ce34d4d65779bebbb6949",
                "sha256:ddd489b4730d7eccf9b836216d7137f85b3e68258a292a618a12e9ce5a7bcfb0",
                "sha256:dee025675506fc84f475b9fb0c8ce2cc9b663f9d7c7a22281ba878538be78fe8",
                "sha256:e6ac3198f4174c1b58e3a6b765d0b9cdcead231ba8bf4ddd30709320960b6e39",
                "sha256:e738782d0216087cb7ee9acc54305db9a30bf9a784bff7a407b748a91dd8c942",
                "sha256:f136b98861f27e2628f824c7c7e8d4bce47c9e18953fd00a0aca1d1c9cfd1b6c"
            ],
            "version": "==1.13.0"
        },
        "html5lib": {
            "hashes": [
                "sha256:2612a191a8d5842bfa057e41ba50bbb9dcb722419d2408c78cff4758d0754868"
            ],
            "version": "==0.9999999"
        },
        "markdown": {
            "hashes": [
                "sha256:9ba587db9daee7ec761cfc656272be6aabe2ed300fece21208e4aab2e457bc8f",
                "sha256:a856869c7ff079ad84a3e19cd87a64998350c2b94e9e08e44270faef33400f81"
            ],
            "version": "==2.6.11"
        },
        "numpy": {
            "hashes": [
                "sha256:07379fe0b450f6fd6e5934a9bc015025bb4ce1c8fbed3ca8bef29328b1bc9570",
                "sha256:085afac75bbc97a096744fcfc97a4b321c5a87220286811e85089ae04885acdd",
                "sha256:2d6481c6bdab1c75affc0fc71eb1bd4b3ecef620d06f2f60c3f00521d54be04f",
                "sha256:2df854df882d322d5c23087a4959e145b953dfff2abe1774fec4f639ac2f3160",
                "sha256:381ad13c30cd1d0b2f3da8a0c1a4aa697487e8bb0e9e0cbeb7439776bcb645f8",
                "sha256:385f1ce46e08676505b692bfde918c1e0b350963a15ef52d77691c2cf0f5dbf6",
                "sha256:4130e5ae16c656b7de654dc5e595cfeb85d3a4b0bb0734d19c0dce6dc7ee0e07",
                "sha256:4d278c2261be6423c5e63d8f0ceb1b0c6db3ff83f2906f4b860db6ae99ca1bb5",
                "sha256:51c5dcb51cf88b34b7d04c15f600b07c6ccbb73a089a38af2ab83c02862318da",
                "sha256:589336ba5199c8061239cf446ee2f2f1fcc0c68e8531ee1382b6fc0c66b2d388",
                "sha256:5ae3564cb630e155a650f4f9c054589848e97836bebae5637240a0d8099f817b",
                "sha256:5edf1acc827ed139086af95ce4449b7b664f57a8c29eb755411a634be280d9f2",
                "sha256:6b82b81c6b3b70ed40bc6d0b71222ebfcd6b6c04a6e7945a936e514b9113d5a3",
                "sha256:6c57f973218b776195d0356e556ec932698f3a563e2f640cfca7020086383f50",
                "sha256:758d1091a501fd2d75034e55e7e98bfd1370dc089160845c242db1c760d944d9",
                "sha256:8622db292b766719810e0cb0f62ef6141e15fe32b04e4eb2959888319e59336b",
                "sha256:8b8dcfcd630f1981f0f1e3846fae883376762a0c1b472baa35b145b911683b7b",
                "sha256:91fdd510743ae4df862dbd51a4354519dd9fb8941347526cd9c2194b792b3da9",
                "sha256:97fa8f1dceffab782069b291e38c4c2227f255cdac5f1e3346666931df87373e",
                "sha256:9b705f18b26fb551366ab6347ba9941b62272bf71c6bbcadcd8af94d10535241",
                "sha256:9d69967673ab7b028c2df09cae05ba56bf4e39e3cb04ebe452b6035c3b49848e",
                "sha256:9e1f53afae865cc32459ad211493cf9e2a3651a7295b7a38654ef3d123808996",
                "sha256:a4a433b3a264dbc9aa9c7c241e87c0358a503ea6394f8737df1683c7c9a102ac",
                "sha256:baadc5f770917ada556afb7651a68176559f4dca5f4b2d0947cd15b9fb84fb51",
                "sha256:c725d11990a9243e6ceffe0ab25a07c46c1cc2c5dc55e305717b5afe856c9608",
                "sha256:d696a8c87315a83983fc59dd27efe034292b9e8ad667aeae51a68b4be14690d9",
                "sha256:e1864a4e9f93ddb2dc6b62ccc2ec1f8250ff4ac0d3d7a15c8985dd4e1fbd6418",
                "sha256:e1d18421a7e2ad4a655b76e65d549d4159f8874c18a417464c1d439ee7ccc7cd"
            ],
            "markers": "python_version != '3.0.*' and python_version != '3.3.*' and python_version != '3.2.*' and python_version != '3.1.*' and python_version >= '2.7'",
            "version": "==1.14.5"
        },
        "protobuf": {
            "hashes": [
                "sha256:12985d9f40c104da2f44ec089449214876809b40fdc5d9e43b93b512b9e74056",
                "sha256:12c97fe27af12fc5d66b23f905ab09dd4fb0c68d5a74a419d914580e6d2e71e3",
                "sha256:327fb9d8a8247bc780b9ea7ed03c0643bc0d22c139b761c9ec1efc7cc3f0923e",
                "sha256:3895319db04c0b3baed74fb66be7ba9f4cd8e88a432b8e71032cdf08b2dfee23",
                "sha256:695072063e256d32335d48b9484451f7c7948edc3dbd419469d6a778602682fc",
                "sha256:7d786f3ef5b33a04e6538089674f244a3b0f588155016559d950989010af97d0",
                "sha256:8bf82bb7a466a54be7272dcb492f71d55a2453a58d862fb74c3f2083f2768543",
                "sha256:9bbc1ae1c33c1bd3a2fc05a3aec328544d2b039ff0ce6f000063628a32fad777",
                "sha256:9f1087abb67b34e55108bc610936b34363a7aac692023bcbb17e065c253a1f80",
                "sha256:9fefcb92a3784b446abf3641d9a14dad815bee88e0edd10b9a9e0e144d01a991",
                "sha256:a37836aa47d1b81c2db1a6b7a5e79926062b5d76bd962115a0e615551be2b48d",
                "sha256:cca22955443c55cf86f963a4ad7057bca95e4dcde84d6a493066d380cfab3bb0",
                "sha256:d7ac50bc06d31deb07ace6de85556c1d7330e5c0958f3b2af85037d6d1182abf",
                "sha256:dfe6899304b898538f4dc94fa0b281b56b70e40f58afa4c6f807805261cbe2e8"
            ],
            "version": "==3.6.0"
        },
        "six": {
            "hashes": [
                "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
                "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
            ],
            "version": "==1.11.0"
        },
        "tensorboard": {
            "hashes": [
                "sha256:2651a4d9261a6593cb2c3514576e4bf25e273837c79e98f68a3cf51759f68725",
                "sha256:7776cc8bcfd0d07cd106e9e86c011ab8eca38c97b57f5433b9f0fd6bbf31a36e"
            ],
            "markers": "python_version != '3.0.*' and python_version != '3.3.*' and python_version != '3.2.*' and python_version != '3.1.*' and python_version >= '2.7'",
            "version": "==1.8.0"
        },
        "tensorflow": {
            "hashes": [
                "sha256:1fc4eb267bc973f2a8466778ad0c6f110f8356373e534c8463a7bb9b6d86e5f0",
                "sha256:24c3d3f87dc6108f4de3bbb7f647bcd6f303f874721b176185f260adea88fe40",
                "sha256:3087797a85610b756066df294f98e666e49f4fa60c6e1dbcf4b190b21397af71",
                "sha256:36a6671d39a3aec89cb4cce125e90305c3f8a69da16d2fb72eff40fe478e1de9",
                "sha256:373c637f9c4f06346b1b02e280b30517d262a1651b252ff889f7c22716ef4548",
                "sha256:397c0766e166fb768613b1498a2a6f67eeea077425d234c0138d55e85408473d",
                "sha256:68bda870c355aa64dc3dc377d5b9d13c829281467a7c3b95cb8529031d8f68b2",
                "sha256:899e53e01efcc8e906b3d1f53fe6a6264edf5dfc275b32cadbc6f4e33dca78f7",
                "sha256:92801b9aebcc195d3b5a492d1d46330c47c11c6f0c0f7ab6b605da489482c64e",
                "sha256:d345d296aeb05eeb50d9de43a1dcb66ceaba6a2bd603f58aeefaa07b2c1bfac1",
                "sha256:dccc205e84cd33a240a601046e88eacefe12d677a1bbdf17f0ebafd1a7c84c70",
                "sha256:de51f60021ea8160ea6d0340e827a26331cd549f6e7c470fba7ee83aeab4f818"
            ],
            "index": "pypi",
            "version": "==1.8.0"
        },
        "termcolor": {
            "hashes": [
                "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b"
            ],
            "version": "==1.1.0"
        },
        "werkzeug": {
            "hashes": [
                "sha256:c3fd7a7d41976d9f44db327260e263132466836cef6f91512889ed60ad26557c",
                "sha256:d5da73735293558eb1651ee2fddc4d0dedcfa06538b8813a2e20011583c9e49b"
            ],
            "version": "==0.14.1"
        },
        "wheel": {
            "hashes": [
                "sha256:0a2e54558a0628f2145d2fc822137e322412115173e8a2ddbe1c9024338ae83c",
                "sha256:80044e51ec5bbf6c894ba0bc48d26a8c20a9ba629f4ca19ea26ecfcf87685f5f"
            ],
            "markers": "python_version >= '3'",
            "version": "==0.31.1"
        }
    },
    "develop": {}
}

Dependency Resolution help wanted

Most helpful comment

Consider this simple scenario. There are packages A, B, C, and D.

  • A depends on B and C.
  • B depends on C and D.

And you specify A in your Pipfile.

The resolver can be thought of working in rounds. For each round, we look inside each package to find their dependencies, add them into the list, and repeat, until we cannot find anymore.

R0: A.
R1: A depends on B and C. Now we have A, B, C.
R2: B depends on C and D; C does not depend on anything. Now A, B, C, D.
R3: D does not depend on anything. Still A, B, C, D. Resolution finished successfully.

Now let’s consider versions. Say A, B, and D each has one version (to keeps things simple), while C has two, C1 and C2.

  • A depends on B and C.
  • B depends on C and D, but requires C1 (i.e. specifies C<2 as a dependency).

R0: A.
R1: A wants on B and C. Which C should we choose? We don’t know.

What Pipenv current does is to always prefer the latest, so…

R1: A, B, C2.
R2: B wants C1 and D. Now we have a problem, we can’t install C1 and C2 at the same time. Resolution fails.

What backtracking allows, is to save before we made that decision in round 1.

R1: A, B, C… save here.
R1a: A, B, C2.
R2-1a: This does not work. Load.
R1b: A, B, C1.
R2-1b: A, B, C1, D. Success!

Now generalise this. Package X may require P<5 in v1, and P>5 in v2. We might choose v2 first, but if that prooves to be a problem later on (perhaps Y requires P<5 in all versions), we can backtrack and choose the v1 series of X instead. Those conflicting version requirements you see generally come from this kind of more complicated graphs, and backtracking is the solution to it (if there is a solution at all).

Backtracking resolution algorithm is largely a solved problem, and there are implementations in various languages. Python, however, is more lacking in this regard. Mixology, which is used by Poetry (another tool that also uses a lock file), and largely similar to Ruby’s Molinillo (used by Bundler and Cocoapods), is the only one I know in real-world production use. Zazo is another, but it is in an even earlier stage.

I hope the above clarifies things somewhat. This is not a simple topic to work on (though again, not difficult, because everything is already solved, you only need to implement it with a straight head), but would help Pipenv—and I’dsay, the whole Python comminuty—tremendously, if done correctly.

All 42 comments

I've been digging into this a bit. It appears that if you specify a top-level requirement like this then the pip resolver will resolve package dependencies correctly and combine the specifiers regardless of where the package comes from.

So in the case above we resolve two requirements: tensorflow==1.8.0 and tensorflow (1.9.0). In the case where I am not pinning tensorflow, I'd expect it to be resolved to the latest versions within the constraints I've specified, but it instead attempts to resolve the mutually incompatible subdependencies of each version, then fails.

This seems to be similar to https://github.com/pypa/pipenv/issues/2583 - the underlying issue is that I (and I'm sure others) assume that a requirement like jinja2 would match any available version within some constraints, but it seems that the resolver instead sees this as jinja2==LATEST_RELEASE. Maybe at some point down the line the LATEST_RELEASE is filtered out for the release that matches the constraints given, but before then it seems to cause havoc in some situations.

It is, indeed. The root issue is that Pipenv’s resolver (which is basically pip-tools) lacks a feature called backtracking. Think of it like save-load points in an RPG video game—you save before you make a decision, and then play on to see what happens. If you don’t like the outcome, load and do things differently, until you get what you want. If nothing you do is satisfying, load an earlier save and try again from there, and so on.

Backtracking is not a simple thing to implement. It is not difficult (basically an already-solved problem), but requires significant resources to implement, which the project lacks. Please do try to work on this issue if you’re interested, we will be very, very thankful for your effort.

Can you elaborate on how backtracking would solve this particular case? I'm very interested in helping if I can - perhaps it's the coffee (or lack thereof) but I cannot see how backtracking fits in specifically here. How would we know when to snapshot? Would this not cause a very exhaustive search which would slow down locking? Wouldn't the number of snapshots and backtracks grow exponentially?

Isn't the real problem here that the resolver cannot work out that >10,<10 is unsolvable and should be resolved as two separate, independent requirements that can be reduced later? Wouldn't a more graph-like structure of dependencies + constraints help here? As far as I can tell (and please correct me if I'm wrong!) the resolver is more of a flat, un-linked bag of individual dependencies?

Consider this simple scenario. There are packages A, B, C, and D.

  • A depends on B and C.
  • B depends on C and D.

And you specify A in your Pipfile.

The resolver can be thought of working in rounds. For each round, we look inside each package to find their dependencies, add them into the list, and repeat, until we cannot find anymore.

R0: A.
R1: A depends on B and C. Now we have A, B, C.
R2: B depends on C and D; C does not depend on anything. Now A, B, C, D.
R3: D does not depend on anything. Still A, B, C, D. Resolution finished successfully.

Now let’s consider versions. Say A, B, and D each has one version (to keeps things simple), while C has two, C1 and C2.

  • A depends on B and C.
  • B depends on C and D, but requires C1 (i.e. specifies C<2 as a dependency).

R0: A.
R1: A wants on B and C. Which C should we choose? We don’t know.

What Pipenv current does is to always prefer the latest, so…

R1: A, B, C2.
R2: B wants C1 and D. Now we have a problem, we can’t install C1 and C2 at the same time. Resolution fails.

What backtracking allows, is to save before we made that decision in round 1.

R1: A, B, C… save here.
R1a: A, B, C2.
R2-1a: This does not work. Load.
R1b: A, B, C1.
R2-1b: A, B, C1, D. Success!

Now generalise this. Package X may require P<5 in v1, and P>5 in v2. We might choose v2 first, but if that prooves to be a problem later on (perhaps Y requires P<5 in all versions), we can backtrack and choose the v1 series of X instead. Those conflicting version requirements you see generally come from this kind of more complicated graphs, and backtracking is the solution to it (if there is a solution at all).

Backtracking resolution algorithm is largely a solved problem, and there are implementations in various languages. Python, however, is more lacking in this regard. Mixology, which is used by Poetry (another tool that also uses a lock file), and largely similar to Ruby’s Molinillo (used by Bundler and Cocoapods), is the only one I know in real-world production use. Zazo is another, but it is in an even earlier stage.

I hope the above clarifies things somewhat. This is not a simple topic to work on (though again, not difficult, because everything is already solved, you only need to implement it with a straight head), but would help Pipenv—and I’dsay, the whole Python comminuty—tremendously, if done correctly.

Without reading into this too much, would something like https://labix.org/python-constraint help here?

Mixology, which is used by Poetry (another tool that also uses a lock file), and largely similar to Ruby’s Molinillo

Just for information this is no longer the case since it was way too slow for Python packaging ecosystem. It works well if all the metadata is available via an API but not otherwise. So I implemented in Poetry another resolver which is lazy (it gets the information only when needed), has conflict resolution and a backtracking algorithm. This led to cutting down extreme cases which would take 30 minutes to less than a minute now. And most of the time it will resolve dependencies in less than 10 seconds.

@sdispater Thanks for the updated information! May I ask if the implementation currently in use in Poetry is still a variant of same backtracking resolver? I’ve been looking into Mixology (and Milinillo), and the problem to me is that the dependency information for each version is fetched too eagerly when populating a specification. I was under the impression that by implementing possibilities as a lazily-evaluated list would solve most of the problem. Is my impression correct, or would there be other bottlenecks that are impossible to get through? Also—do you plan to extract the new mixology implementation so it can be used in another project? It would greatly benefit not only Pipenv, but also the general Python ecosystem in general (e.g. it would solve a large portion of the long-standing pip problem).

@oliland Indeed! Constraint Satification is a generalisation of this particular topic. The library works in a lower level (more abstract, mathematical) than specialised dependency resolvers, but they are all solving the same problem in the end.

So I implemented in Poetry another resolver which is lazy (it gets the information only when needed), has conflict resolution and a backtracking algorithm.

Would you be willing to split this out into a separate package? I would love to help with that, if you're time constrained and agreeable, as it could help a lot of projects in the ecosystem. It seems somewhat silly that the large number of tools that are springing up around this area all have to implement their own version of this, with various deficiencies and trade offs.

@sdispater if you have plans to isolate mixology I am very interested, I have some implementations that haven't made it into pipenv due to time constraints but that probably is a project where we can collaborate a bit. Is it a full sat solver? Haven't yet seen a good implementation in python

@uranusjr The resolver has a backtracking algorithm but it's rarely used since the cases where a true conflict occurs are rare.

I’ve been looking into Mixology (and Milinillo), and the problem to me is that the dependency information for each version is fetched too eagerly when populating a specification.

I agree and that's why I rewrote the resolver completely since it was too slow sometimes to be usable.

I was under the impression that by implementing possibilities as a lazily-evaluated list would solve most of the problem.

I tried that but it didn't lead anywhere, at least with the previous algorithm. It would make this worse since you couldn't check that a package's dependency set had already been seen before and thus ditch the package if it had been, so you would inspect packages that did not warrant being checked, slowing down the process even more.

@uranusjr @orf @techalchemy I plan on extract it from Poetry at some point, yes. However, I don't have an ETA yet since right now it's tightly coupled with other parts of the codebase (like a version constraint module). So I have to abstract some of the concepts used internally to make it a trully independent library.

@sdispater thanks for the clarity on that, appreciate the info! Definitely keep us posted, feel free to let us know if we can help out at all

@sdispater Would you mind if I try to extract Mixology from Poetry into a standalone repository on my own? I’m trying to work on the resolver logic, and it would be great if I could have something to interface against. I will include appropriate attribution, of course.

While this issue is being resolved is there a workaround for those of us who want to use pipenv for packages which resolve to unresolvable states? For example I have a pipfile which resolves jupyter to an unresolvable state (most likely because I am using python 2.7 which is stuck on ipython<6). I've specified ipython = "<6" in my pipfile but pipenv install still fails if I include jupyter or jupyterlab in the pipfile. I've resorted to using an extra script in my build process which runs pipenv install jupyter --skip-lock but I'd like to avoid that and somehow specify the --skip-lock in the pipfile. I understand this in some ways undermines the purpose of a pipfile but the alternative is to create a build process which calls a series of shell scripts or avoid using pipenv altogether. Another issue with my current set up is that it's not clear just from reading the pipfile that the program has a dependency on jupyter.

@lukesmurray poetry is an alternative dependency version management tool that serves the same purpose of pipenv, but they claim to have a better dependency resolution algorithm than pipenv. In case you can't afford to way this bug to be fixed, you could use it.

Pipenv is already integrated in my deployment process, so I particularly rather wait for this to be fixed.

@uranusjr I would like to help out with this if at all possible. Would you want the dependency resolution to be built on top of the patched version of pip-tools?

FWIW, this appears to be a recent regression and downgrading to pipenv==2018.5.18 is a workaround until this issue is fixed. I suspect it's related to the upgrade from pip 9 to pip 10 (i.e. #2255).

hm interesting @ltm thanks for the tip. That gives us a good place to start looking

@lukesmurray We are still trying to figure out the best approach. It would be worthwhile to take a look at pip-tools and see if it can be built upon, but we don’t necessarily need to build on it.

Chiming in to say that @ltm solution of rolling back to 2018.5.18 worked for me as a work around 👍

I can report that I am having a similar issue when trying to install pytest and pytest-cov, which is a plugin of pytest.

Since there are no restrictions on both of the items, there should be no conflicts between both since pytest-cov is developed to be used with pytest as a plugin. There should be a version of pytest (if not the latest) which works with pytest-cov.

A minimal Pipfile like the one below will fail complaining that it could not find a version that matches pluggy<0.7,>=0.5,>=0.7:

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
pytest-cov = "*"
pytest = "*"

[requires]
python_version = "3.6"

The issue with pytest has been discussed here as well. It seems like pytest changed pluggy pinning from >=0.5,<0.7 to >=0.7. Thus, in the first round pipenv finds the old dependency as a constraint and does not update this constraint anymore.

pipenv lock --clear will clear your dependency cache and resolve it properly

Can confirm that running pipenv lock --clear worked

It's probably a good idea to suggest this to the final user while subdependency management is not improved, in the same way that pipenv suggests to run pipenv install --skip-lock.

I would like to mention that, as always, contributions toward usability improvements and better error messaging are highly welcomed, and tend to be accepted very quickly, if anyone really cares enough to submit a pull request :)

nor to add jinja2 = "==2.9.0" explicitly in you Pipfile not pipenv lock --clear helped...
How can I use pipenv together with airflow?

Is this being worked on? I can't find a related PR for this.

@gerardo I think it is being worked on in passa project.

It appears to be the same issue with the smart-open package

Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
  Hint: try $ pipenv lock --pre if it is a pre-release dependency.
Could not find a version that matches botocore<1.11.0,<1.13.0,<2.0.0,==1.10.84,>=1.10.65,>=1.12.0,>=1.3.0

And the graph

smart-open==1.6.0
  - boto [required: >=2.32, installed: 2.49.0]
  - boto3 [required: Any, installed: 1.9.0]
    - botocore [required: >=1.12.0,<1.13.0, installed: 1.12.0]
      - docutils [required: >=0.10, installed: 0.14]
      - jmespath [required: >=0.7.1,<1.0.0, installed: 0.9.3]
      - python-dateutil [required: >=2.1,<3.0.0, installed: 2.7.3]
        - six [required: >=1.5, installed: 1.11.0]
      - urllib3 [required: >=1.20,<1.24, installed: 1.23]
    - jmespath [required: >=0.7.1,<1.0.0, installed: 0.9.3]
    - s3transfer [required: >=0.1.10,<0.2.0, installed: 0.1.13]
      - botocore [required: >=1.3.0,<2.0.0, installed: 1.12.0]
        - docutils [required: >=0.10, installed: 0.14]
        - jmespath [required: >=0.7.1,<1.0.0, installed: 0.9.3]
        - python-dateutil [required: >=2.1,<3.0.0, installed: 2.7.3]
          - six [required: >=1.5, installed: 1.11.0]
        - urllib3 [required: >=1.20,<1.24, installed: 1.23]
  - bz2file [required: Any, installed: 0.98]
  - requests [required: Any, installed: 2.19.1]
    - certifi [required: >=2017.4.17, installed: 2018.8.24]
    - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
    - idna [required: >=2.5,<2.8, installed: 2.7]
    - urllib3 [required: >=1.21.1,<1.24, installed: 1.23]

Encountered another such situation:

It's not hindering my ability to use the packages, but there is a warning.

Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
  Hint: try $ pipenv lock --pre if it is a pre-release dependency.
Could not find a version that matches django<2.1.0,==2.1.1,>=1.5 (from -r /tmp/pipenv-jb_c05f6-requirements/pipenv-wlikcsrz-constraints.txt (line 8))
Tried: 1.1.3, 1.1.4, 1.2, 1.2.1, 1.2.2, 1.2.3, 1.2.4, 1.2.5, 1.2.6, 1.2.7, 1.3, 1.3.1, 1.3.2, 1.3.3, 1.3.4, 1.3.5, 1.3.6, 1.3.7, 1.4, 1.4.1, 1.4.2, 1.4.3, 1.4.4, 1.4.5, 1.4.6, 1.4.7, 1.4.8, 1.4.9, 1.4.10, 1.4.11, 1.4.12, 1.4.13, 1.4.14, 1.4.15, 1.4.16, 1.4.17, 1.4.18, 1.4.19, 1.4.20, 1.4.21, 1.4.22, 1.5, 1.5.1, 1.5.2, 1.5.2, 1.5.3, 1.5.4, 1.5.5, 1.5.6, 1.5.7, 1.5.8, 1.5.8, 1.5.9, 1.5.10, 1.5.11, 1.5.12, 1.5.12, 1.6, 1.6, 1.6.1, 1.6.1, 1.6.2, 1.6.2, 1.6.3, 1.6.3, 1.6.4, 1.6.4, 1.6.5, 1.6.5, 1.6.6, 1.6.6, 1.6.7, 1.6.7, 1.6.8, 1.6.8, 1.6.9, 1.6.9, 1.6.10, 1.6.10, 1.6.11, 1.6.11, 1.7, 1.7, 1.7.1, 1.7.1, 1.7.2, 1.7.2, 1.7.3, 1.7.3, 1.7.4, 1.7.4, 1.7.5, 1.7.5, 1.7.6, 1.7.6, 1.7.7, 1.7.7, 1.7.8, 1.7.8, 1.7.9, 1.7.9, 1.7.10, 1.7.10, 1.7.11, 1.7.11, 1.8, 1.8, 1.8.1, 1.8.1, 1.8.2, 1.8.2, 1.8.3, 1.8.3, 1.8.4, 1.8.4, 1.8.5, 1.8.5, 1.8.6, 1.8.6, 1.8.7, 1.8.7, 1.8.8, 1.8.8, 1.8.9, 1.8.9, 1.8.10, 1.8.10, 1.8.11, 1.8.11, 1.8.12, 1.8.12, 1.8.13, 1.8.13, 1.8.14, 1.8.14, 1.8.15, 1.8.15, 1.8.16, 1.8.16, 1.8.17, 1.8.17, 1.8.18, 1.8.18, 1.8.19, 1.8.19, 1.9, 1.9, 1.9.1, 1.9.1, 1.9.2, 1.9.2, 1.9.3, 1.9.3, 1.9.4, 1.9.4, 1.9.5, 1.9.5, 1.9.6, 1.9.6, 1.9.7, 1.9.7, 1.9.8, 1.9.8, 1.9.9, 1.9.9, 1.9.10, 1.9.10, 1.9.11, 1.9.11, 1.9.12, 1.9.12, 1.9.13, 1.9.13, 1.10, 1.10, 1.10.1, 1.10.1, 1.10.2, 1.10.2, 1.10.3, 1.10.3, 1.10.4, 1.10.4, 1.10.5, 1.10.5, 1.10.6, 1.10.6, 1.10.7, 1.10.7, 1.10.8, 1.10.8, 1.11, 1.11, 1.11.1, 1.11.1, 1.11.2, 1.11.2, 1.11.3, 1.11.3, 1.11.4, 1.11.4, 1.11.5, 1.11.5, 1.11.6, 1.11.6, 1.11.7, 1.11.7, 1.11.8, 1.11.8, 1.11.9, 1.11.9, 1.11.10, 1.11.10, 1.11.11, 1.11.11, 1.11.12, 1.11.12, 1.11.13, 1.11.13, 1.11.14, 1.11.14, 1.11.15, 1.11.15, 2.0, 2.0, 2.0.1, 2.0.1, 2.0.2, 2.0.2, 2.0.3, 2.0.3, 2.0.4, 2.0.4, 2.0.5, 2.0.5, 2.0.6, 2.0.6, 2.0.7, 2.0.7, 2.0.8, 2.0.8, 2.1, 2.1, 2.1.1, 2.1.1
Skipped pre-versions: 1.8a1, 1.8b1, 1.8b2, 1.8rc1, 1.9a1, 1.9b1, 1.9rc1, 1.9rc2, 1.10a1, 1.10a1, 1.10b1, 1.10b1, 1.10rc1, 1.10rc1, 1.11a1, 1.11b1, 1.11rc1, 1.11rc1, 2.0a1, 2.0b1, 2.0rc1, 2.1a1, 2.1b1, 2.1rc1
There are incompatible versions in the resolved dependencies.

$ pipenv graph

Adafruit-ADS1x15==1.0.2
  - Adafruit-GPIO [required: >=0.6.5, installed: 1.0.3]
    - adafruit-pureio [required: Any, installed: 0.2.3]
    - spidev [required: Any, installed: 3.2]
crayons==0.1.2
  - colorama [required: Any, installed: 0.3.9]
django-click==2.1.0
  - click [required: >5.0, installed: 6.7]
  - six [required: >=1.9.0, installed: 1.11.0]
django-hamlpy==1.1.1
  - django [required: Any, installed: 2.0.8]
    - pytz [required: Any, installed: 2018.5]
  - enum34 [required: Any, installed: 1.1.6]
  - future [required: Any, installed: 0.16.0]
  - regex [required: Any, installed: 2018.8.29]
  - six [required: Any, installed: 1.11.0]
enaml==0.10.2
  - atom [required: >=0.4.1, installed: 0.4.1]
    - future [required: Any, installed: 0.16.0]
    - setuptools [required: Any, installed: 40.0.0]
  - future [required: Any, installed: 0.16.0]
  - kiwisolver [required: >=1.0.0, installed: 1.0.1]
    - setuptools [required: Any, installed: 40.0.0]
  - ply [required: >=3.4, installed: 3.11]
  - qtpy [required: >=1.3, installed: 1.5.0]
  - setuptools [required: Any, installed: 40.0.0]
furl==1.2.1
  - orderedmultidict [required: >=1.0, installed: 1.0]
    - six [required: >=1.8.0, installed: 1.11.0]
  - six [required: >=1.8.0, installed: 1.11.0]
google-api-python-client==1.7.4
  - google-auth [required: >=1.4.1, installed: 1.5.1]
    - cachetools [required: >=2.0.0, installed: 2.1.0]
    - pyasn1-modules [required: >=0.2.1, installed: 0.2.2]
      - pyasn1 [required: >=0.4.1,<0.5.0, installed: 0.4.4]
    - rsa [required: >=3.1.4, installed: 3.4.2]
      - pyasn1 [required: >=0.1.3, installed: 0.4.4]
    - six [required: >=1.9.0, installed: 1.11.0]
  - google-auth-httplib2 [required: >=0.0.3, installed: 0.0.3]
    - google-auth [required: Any, installed: 1.5.1]
      - cachetools [required: >=2.0.0, installed: 2.1.0]
      - pyasn1-modules [required: >=0.2.1, installed: 0.2.2]
        - pyasn1 [required: >=0.4.1,<0.5.0, installed: 0.4.4]
      - rsa [required: >=3.1.4, installed: 3.4.2]
        - pyasn1 [required: >=0.1.3, installed: 0.4.4]
      - six [required: >=1.9.0, installed: 1.11.0]
    - httplib2 [required: >=0.9.1, installed: 0.11.3]
  - httplib2 [required: >=0.9.2,<1dev, installed: 0.11.3]
  - six [required: >=1.6.1,<2dev, installed: 1.11.0]
  - uritemplate [required: >=3.0.0,<4dev, installed: 3.0.0]
gunicorn==19.9.0
ipython==6.5.0
  - backcall [required: Any, installed: 0.1.0]
  - decorator [required: Any, installed: 4.3.0]
  - jedi [required: >=0.10, installed: 0.12.1]
    - parso [required: >=0.3.0, installed: 0.3.1]
  - pexpect [required: Any, installed: 4.6.0]
    - ptyprocess [required: >=0.5, installed: 0.6.0]
  - pickleshare [required: Any, installed: 0.7.4]
  - prompt-toolkit [required: >=1.0.15,<2.0.0, installed: 1.0.15]
    - six [required: >=1.9.0, installed: 1.11.0]
    - wcwidth [required: Any, installed: 0.1.7]
  - pygments [required: Any, installed: 2.2.0]
  - setuptools [required: >=18.5, installed: 40.0.0]
  - simplegeneric [required: >0.8, installed: 0.8.1]
  - traitlets [required: >=4.2, installed: 4.3.2]
    - decorator [required: Any, installed: 4.3.0]
    - ipython-genutils [required: Any, installed: 0.2.0]
    - six [required: Any, installed: 1.11.0]
isodate==0.6.0
  - six [required: Any, installed: 1.11.0]
numpy==1.15.1
oauth2client==4.1.3
  - httplib2 [required: >=0.9.1, installed: 0.11.3]
  - pyasn1 [required: >=0.1.7, installed: 0.4.4]
  - pyasn1-modules [required: >=0.0.5, installed: 0.2.2]
    - pyasn1 [required: >=0.4.1,<0.5.0, installed: 0.4.4]
  - rsa [required: >=3.1.4, installed: 3.4.2]
    - pyasn1 [required: >=0.1.3, installed: 0.4.4]
  - six [required: >=1.6.1, installed: 1.11.0]
parse==1.8.4
PyQt5==5.11.2
  - PyQt5-sip [required: >=4.19.11,<4.20, installed: 4.19.12]
python-decouple==3.1
python-mpv==0.3.9
RPi.GPIO==0.6.3
spotipy==2.4.4
  - requests [required: >=1.0, installed: 2.19.1]
    - certifi [required: >=2017.4.17, installed: 2018.8.24]
    - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
    - idna [required: >=2.5,<2.8, installed: 2.7]
    - urllib3 [required: >=1.21.1,<1.24, installed: 1.23]
stream-django==1.4.0
  - django [required: >=1.5,<2.1.0, installed: 2.0.8]
    - pytz [required: Any, installed: 2018.5]
  - pytz [required: Any, installed: 2018.5]
  - stream-python [required: >=2.8.1, installed: 2.11.0]
    - pycryptodomex [required: ==3.4.7, installed: 3.4.7]
    - pyjwt [required: >=1.3.0,<1.7.0, installed: 1.6.4]
    - requests [required: >=2.3.0,<3, installed: 2.19.1]
      - certifi [required: >=2017.4.17, installed: 2018.8.24]
      - chardet [required: >=3.0.2,<3.1.0, installed: 3.0.4]
      - idna [required: >=2.5,<2.8, installed: 2.7]
      - urllib3 [required: >=1.21.1,<1.24, installed: 1.23]
    - six [required: >=1.8.0, installed: 1.11.0]
youtube-dl==2018.9.8
zproc==0.9.2
  - psutil [required: Any, installed: 5.4.7]
  - pyzmq [required: Any, installed: 17.1.2]
  - tblib [required: Any, installed: 1.3.2]

Pipfile

[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"

[packages]
crayons = "*"
numpy = "*"
requests = "*"
spotipy = "*"
isodate = "*"
google-api-python-client = "*"
django = "*"
youtube-dl = "*"
click = "*"
"oauth2client" = "*"
"rpi.gpio" = "*"
"adafruit-ads1x15" = "*"
python-decouple = "*"
django-click = "*"
parse = "*"
furl = "*"
django-hamlpy = "*"
python-mpv = "*"
zproc = {editable = true, ref = "next", git = "https://github.com/pycampers/zproc.git"}
gunicorn = "*"
stream-django = "*"

[dev-packages]
enaml = "*"
"pyqt5" = "*"
ipython = "*"

[requires]
python_version = "3.6"

Pipfile.lock

{
    "_meta": {
        "hash": {
            "sha256": "d9fbd586f9779af10ebd259a329d91a5cd28eb33b26c052e8ca3cafcf52a0bd5"
        },
        "pipfile-spec": 6,
        "requires": {
            "python_version": "3.6"
        },
        "sources": [
            {
                "name": "pypi",
                "url": "https://pypi.python.org/simple",
                "verify_ssl": true
            }
        ]
    },
    "default": {
        "adafruit-ads1x15": {
            "hashes": [
                "sha256:058021475c51d8fad6ce8417d69ca5aea71dec9d9e5292e6b83b6cc8b338dcd3",
                "sha256:2076c114e3ca938ef5de13c608f2b28c517ca3d53407432fd470118556ab3feb"
            ],
            "index": "pypi",
            "version": "==1.0.2"
        },
        "adafruit-gpio": {
            "hashes": [
                "sha256:d6465b92c866c51ca8f3bc1e8f2ec36f5ccdb46d0fd54101c1109756d4a2dcd0"
            ],
            "version": "==1.0.3"
        },
        "adafruit-pureio": {
            "hashes": [
                "sha256:e65cd929f1d8e109513ed1e457c2742bf4f15349c1a9b7f5b1e04191624d7488"
            ],
            "version": "==0.2.3"
        },
        "cachetools": {
            "hashes": [
                "sha256:90f1d559512fc073483fe573ef5ceb39bf6ad3d39edc98dc55178a2b2b176fa3",
                "sha256:d1c398969c478d336f767ba02040fa22617333293fb0b8968e79b16028dfee35"
            ],
            "version": "==2.1.0"
        },
        "certifi": {
            "hashes": [
                "sha256:376690d6f16d32f9d1fe8932551d80b23e9d393a8578c5633a2ed39a64861638",
                "sha256:456048c7e371c089d0a77a5212fb37a2c2dce1e24146e3b7e0261736aaeaa22a"
            ],
            "version": "==2018.8.24"
        },
        "chardet": {
            "hashes": [
                "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae",
                "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"
            ],
            "version": "==3.0.4"
        },
        "click": {
            "hashes": [
                "sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d",
                "sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b"
            ],
            "index": "pypi",
            "version": "==6.7"
        },
        "colorama": {
            "hashes": [
                "sha256:463f8483208e921368c9f306094eb6f725c6ca42b0f97e313cb5d5512459feda",
                "sha256:48eb22f4f8461b1df5734a074b57042430fb06e1d61bd1e11b078c0fe6d7a1f1"
            ],
            "version": "==0.3.9"
        },
        "crayons": {
            "hashes": [
                "sha256:5e17691605e564d63482067eb6327d01a584bbaf870beffd4456a3391bd8809d",
                "sha256:6f51241d0c4faec1c04c1c0ac6a68f1d66a4655476ce1570b3f37e5166a599cc"
            ],
            "index": "pypi",
            "version": "==0.1.2"
        },
        "django": {
            "hashes": [
                "sha256:04f2e423f2e60943c02bd2959174b844f7d1bcd19eabb7f8e4282999958021fd",
                "sha256:e1cc1cd6b658aa4e052f5f2b148bfda08091d7c3558529708342e37e4e33f72c"
            ],
            "index": "pypi",
            "version": "==2.1.1"
        },
        "django-click": {
            "hashes": [
                "sha256:1803979cbe328333ec935c8ddfbf03da40f94f3361585cf4142ac7c4da2d5fde",
                "sha256:d46cc7abcd5d7e612dcd75ba56bf57ee404d62de7d09c7c3397fa1f475c9c753"
            ],
            "index": "pypi",
            "version": "==2.1.0"
        },
        "django-hamlpy": {
            "hashes": [
                "sha256:90c4db413b9ab71b0a06daeb01181e935e06d053cfbe91fcf2c2ca7d5df6aaa2",
                "sha256:ac899cfc0595b228b4fa71d0d6bb9c02697d8ef68488e15e6798333f4e5a3abd"
            ],
            "index": "pypi",
            "version": "==1.1.1"
        },
        "enum34": {
            "hashes": [
                "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850",
                "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a",
                "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79",
                "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"
            ],
            "version": "==1.1.6"
        },
        "furl": {
            "hashes": [
                "sha256:17654103b8d0cbe42798592db099c728165ac12057d49fe2e69de967d87bf29b"
            ],
            "index": "pypi",
            "version": "==1.2.1"
        },
        "future": {
            "hashes": [
                "sha256:e39ced1ab767b5936646cedba8bcce582398233d6a627067d4c6a454c90cfedb"
            ],
            "version": "==0.16.0"
        },
        "google-api-python-client": {
            "hashes": [
                "sha256:5d5cb02c6f3112c68eed51b74891a49c0e35263380672d662f8bfe85b8114d7c",
                "sha256:7cc47cf80b25ecd7f3d917ea247bb6c62587514e40604ae29c47c0e4ebd1174b"
            ],
            "index": "pypi",
            "version": "==1.7.4"
        },
        "google-auth": {
            "hashes": [
                "sha256:9ca363facbf2622d9ba828017536ccca2e0f58bd15e659b52f312172f8815530",
                "sha256:a4cf9e803f2176b5de442763bd339b313d3f1ed3002e3e1eb6eec1d7c9bbc9b4"
            ],
            "version": "==1.5.1"
        },
        "google-auth-httplib2": {
            "hashes": [
                "sha256:098fade613c25b4527b2c08fa42d11f3c2037dda8995d86de0745228e965d445",
                "sha256:f1c437842155680cf9918df9bc51c1182fda41feef88c34004bd1978c8157e08"
            ],
            "version": "==0.0.3"
        },
        "gunicorn": {
            "hashes": [
                "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471",
                "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3"
            ],
            "index": "pypi",
            "version": "==19.9.0"
        },
        "httplib2": {
            "hashes": [
                "sha256:e71daed9a0e6373642db61166fa70beecc9bf04383477f84671348c02a04cbdf"
            ],
            "version": "==0.11.3"
        },
        "idna": {
            "hashes": [
                "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e",
                "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16"
            ],
            "version": "==2.7"
        },
        "isodate": {
            "hashes": [
                "sha256:2e364a3d5759479cdb2d37cce6b9376ea504db2ff90252a2e5b7cc89cc9ff2d8",
                "sha256:aa4d33c06640f5352aca96e4b81afd8ab3b47337cc12089822d6f322ac772c81"
            ],
            "index": "pypi",
            "version": "==0.6.0"
        },
        "numpy": {
            "hashes": [
                "sha256:1c362ad12dd09a43b348bb28dd2295dd9cdf77f41f0f45965e04ba97f525b864",
                "sha256:2156a06bd407918df4ac0122df6497a9c137432118f585e5b17d543e593d1587",
                "sha256:24e4149c38489b51fc774b1e1faa9103e82f73344d7a00ba66f6845ab4769f3f",
                "sha256:340ec1697d9bb3a9c464028af7a54245298502e91178bddb4c37626d36e197b7",
                "sha256:35db8d419345caa4eeaa65cd63f34a15208acd87530a30f0bc25fc84f55c8c80",
                "sha256:361370e9b7f5e44c41eee29f2bb5cb3b755abb4b038bce6d6cbe08db7ff9cb74",
                "sha256:36e8dcd1813ca92ce7e4299120cee6c03adad33d89b54862c1b1a100443ac399",
                "sha256:378378973546ecc1dfaf9e24c160d683dd04df871ecd2dcc86ce658ca20f92c0",
                "sha256:419e6faee16097124ee627ed31572c7e80a1070efa25260b78097cca240e219a",
                "sha256:4287104c24e6a09b9b418761a1e7b1bbde65105f110690ca46a23600a3c606b8",
                "sha256:549f3e9778b148a47f4fb4682955ed88057eb627c9fe5467f33507c536deda9d",
                "sha256:5e359e9c531075220785603e5966eef20ccae9b3b6b8a06fdfb66c084361ce92",
                "sha256:5ee7f3dbbdba0da75dec7e94bd7a2b10fe57a83e1b38e678200a6ad8e7b14fdc",
                "sha256:62d55e96ec7b117d3d5e618c15efcf769e70a6effaee5842857b64fb4883887a",
                "sha256:719b6789acb2bc86ea9b33a701d7c43dc2fc56d95107fd3c5b0a8230164d4dfb",
                "sha256:7a70f2b60d48828cba94a54a8776b61a9c2657a803d47f5785f8062e3a9c7c55",
                "sha256:7b9e37f194f8bcdca8e9e6af92e2cbad79e360542effc2dd6b98d63955d8d8a3",
                "sha256:83b8fc18261b70f45bece2d392537c93dc81eb6c539a16c9ac994c47fc79f09a",
                "sha256:9473ad28375710ab18378e72b59422399b27e957e9339c413bf00793b4b12df0",
                "sha256:95b085b253080e5d09f7826f5e27dce067bae813a132023a77b739614a29de6e",
                "sha256:98b86c62c08c2e5dc98a9c856d4a95329d11b1c6058cb9b5191d5ea6891acd09",
                "sha256:a3bd01d6d3ed3d7c06d7f9979ba5d68281f15383fafd53b81aa44b9191047cf8",
                "sha256:c81a6afc1d2531a9ada50b58f8c36197f8418ef3d0611d4c1d7af93fdcda764f",
                "sha256:ce75ed495a746e3e78cfa22a77096b3bff2eda995616cb7a542047f233091268",
                "sha256:dae8618c0bcbfcf6cf91350f8abcdd84158323711566a8c5892b5c7f832af76f",
                "sha256:df0b02c6705c5d1c25cc35c7b5d6b6f9b3b30833f9d178843397ae55ecc2eebb",
                "sha256:e3660744cda0d94b90141cdd0db9308b958a372cfeee8d7188fdf5ad9108ea82",
                "sha256:f2362d0ca3e16c37782c1054d7972b8ad2729169567e3f0f4e5dd3cdf85f188e"
            ],
            "index": "pypi",
            "version": "==1.15.1"
        },
        "oauth2client": {
            "hashes": [
                "sha256:b8a81cc5d60e2d364f0b1b98f958dbd472887acaf1a5b05e21c28c31a2d6d3ac",
                "sha256:d486741e451287f69568a4d26d70d9acd73a2bbfa275746c535b4209891cccc6"
            ],
            "index": "pypi",
            "version": "==4.1.3"
        },
        "orderedmultidict": {
            "hashes": [
                "sha256:24e3b730cf84e4a6a68be5cc760864905cf66abc89851e724bd5b4e849eaa96b",
                "sha256:b89895ba6438038d0bdf88020ceff876cf3eae0d5c66a69b526fab31125db2c5"
            ],
            "version": "==1.0"
        },
        "parse": {
            "hashes": [
                "sha256:c3cdf6206f22aeebfa00e5b954fcfea13d1b2dc271c75806b6025b94fb490939"
            ],
            "index": "pypi",
            "version": "==1.8.4"
        },
        "psutil": {
            "hashes": [
                "sha256:0d8da7333549a998556c18eb2af3ce902c28d66ceb947505c008f91e9f988abd",
                "sha256:1914bacbd2fc2af8f795daa44b9d2e0649a147460cfd21b1a70a124472f66d40",
                "sha256:215d61a901e67b1a35e14c6aedef317f7fa7e6075a20c150fd11bd2c906d2c83",
                "sha256:51057c03aea251ad6667c2bba259bc7ed3210222d3a74152c84e3ab06e1da0ba",
                "sha256:5b6322b167a5ba0c5463b4d30dfd379cd4ce245a1162ebf8fc7ab5c5ffae4f3b",
                "sha256:a890c3e490493f21da2817ffc92822693bc0d6bcac9999caa04ffce8dd4e7132",
                "sha256:b34611280a2d0697f1c499e15e936d88109170194b390599c98bab8072a71f05",
                "sha256:cea2557ee6a9faa2c100947637ded68414e12b851633c4ce26e0311b2a2ed539",
                "sha256:d081707ef0081920533db30200a2d30d5c0ea9cf6afa7cf8881ae4516cc69c48"
            ],
            "markers": "python_version >= '2.6' and python_version != '3.0.*' and python_version != '3.2.*' and python_version != '3.1.*' and python_version != '3.3.*'",
            "version": "==5.4.7"
        },
        "pyasn1": {
            "hashes": [
                "sha256:b9d3abc5031e61927c82d4d96c1cec1e55676c1a991623cfed28faea73cdd7ca",
                "sha256:f58f2a3d12fd754aa123e9fa74fb7345333000a035f3921dbdaa08597aa53137"
            ],
            "version": "==0.4.4"
        },
        "pyasn1-modules": {
            "hashes": [
                "sha256:a0cf3e1842e7c60fde97cb22d275eb6f9524f5c5250489e292529de841417547",
                "sha256:a38a8811ea784c0136abfdba73963876328f66172db21a05a82f9515909bfb4e"
            ],
            "version": "==0.2.2"
        },
        "python-decouple": {
            "hashes": [
                "sha256:1317df14b43efee4337a4aa02914bf004f010cd56d6c4bd894e6474ec8c4fe2d"
            ],
            "index": "pypi",
            "version": "==3.1"
        },
        "python-mpv": {
            "hashes": [
                "sha256:13dbbbcbd996afda37163cae6d4cbad0ef510188e467b16bc50aadc2a2cbdd52"
            ],
            "index": "pypi",
            "version": "==0.3.9"
        },
        "pytz": {
            "hashes": [
                "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053",
                "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277"
            ],
            "version": "==2018.5"
        },
        "pyzmq": {
            "hashes": [
                "sha256:25a0715c8f69cf72f67cfe5a68a3f3ed391c67c063d2257bec0fe7fc2c7f08f8",
                "sha256:2bab63759632c6b9e0d5bf19cc63c3b01df267d660e0abcf230cf0afaa966349",
                "sha256:30ab49d99b24bf0908ebe1cdfa421720bfab6f93174e4883075b7ff38cc555ba",
                "sha256:32c7ca9fc547a91e3c26fc6080b6982e46e79819e706eb414dd78f635a65d946",
                "sha256:41219ae72b3cc86d97557fe5b1ef5d1adc1057292ec597b50050874a970a39cf",
                "sha256:4b8c48a9a13cea8f1f16622f9bd46127108af14cd26150461e3eab71e0de3e46",
                "sha256:55724997b4a929c0d01b43c95051318e26ddbae23565018e138ae2dc60187e59",
                "sha256:65f0a4afae59d4fc0aad54a917ab599162613a761b760ba167d66cc646ac3786",
                "sha256:6f88591a8b246f5c285ee6ce5c1bf4f6bd8464b7f090b1333a446b6240a68d40",
                "sha256:75022a4c60dcd8765bb9ca32f6de75a0ec83b0d96e0309dc479f4c7b21f26cb7",
                "sha256:76ea493bfab18dcb090d825f3662b5612e2def73dffc196d51a5194b0294a81d",
                "sha256:7b60c045b80709e4e3c085bab9b691e71761b44c2b42dbb047b8b498e7bc16b3",
                "sha256:8e6af2f736734aef8ed6f278f9f552ec7f37b1a6b98e59b887484a840757f67d",
                "sha256:9ac2298e486524331e26390eac14e4627effd3f8e001d4266ed9d8f1d2d31cce",
                "sha256:9ba650f493a9bc1f24feca1d90fce0e5dd41088a252ac9840131dfbdbf3815ca",
                "sha256:a02a4a385e394e46012dc83d2e8fd6523f039bb52997c1c34a2e0dd49ed839c1",
                "sha256:a3ceee84114d9f5711fa0f4db9c652af0e4636c89eabc9b7f03a3882569dd1ed",
                "sha256:a72b82ac1910f2cf61a49139f4974f994984475f771b0faa730839607eeedddf",
                "sha256:ab136ac51027e7c484c53138a0fab4a8a51e80d05162eb7b1585583bcfdbad27",
                "sha256:c095b224300bcac61e6c445e27f9046981b1ac20d891b2f1714da89d34c637c8",
                "sha256:c5cc52d16c06dc2521340d69adda78a8e1031705924e103c0eb8fc8af861d810",
                "sha256:d612e9833a89e8177f8c1dc68d7b4ff98d3186cd331acd616b01bbdab67d3a7b",
                "sha256:e828376a23c66c6fe90dcea24b4b72cd774f555a6ee94081670872918df87a19",
                "sha256:e9767c7ab2eb552796440168d5c6e23a99ecaade08dda16266d43ad461730192",
                "sha256:ebf8b800d42d217e4710d1582b0c8bff20cdcb4faad7c7213e52644034300924"
            ],
            "markers": "python_version != '3.0*' and python_version != '3.1*' and python_version != '3.2*' and python_version >= '2.7'",
            "version": "==17.1.2"
        },
        "regex": {
            "hashes": [
                "sha256:22d7ef8c2df344328a8a3c61edade2ee714e5de9360911d22a9213931c769faa",
                "sha256:3a699780c6b712c67dc23207b129ccc6a7e1270233f7aadead3ea3f83c893702",
                "sha256:42f460d349baebd5faec02a0c920988fb0300b24baf898d9c139886565b66b6c",
                "sha256:43bf3d79940cbdf19adda838d8b26b28b47bec793cda46590b5b25703742f440",
                "sha256:47d6c7f0588ef33464e00023067c4e7cce68e0d6a686a73c7ee15abfdad503d4",
                "sha256:5b879f59f25ed9b91bc8693a9a994014b431f224f492519ad0255ce6b54b83e5",
                "sha256:8ba0093c412900f636b0f826c597a0c3ea0e395344bc99894ddefe88b76c9c7e",
                "sha256:a4789254a1a0bd7a637036cce0b7ed72d8cc864e93f2e9cfd10ac00ae27bb7b0",
                "sha256:b73cea07117dca888b0c3671770b501bef19aac9c45c8ffdb5bea2cca2377b0a",
                "sha256:d3eb59fa3e5b5438438ec97acd9dc86f077428e020b015b43987e35bea68ef4c",
                "sha256:d51d232b4e2f106deaf286001f563947fee255bc5bd209a696f027e15cf0a1e7",
                "sha256:d59b03131a8e35061b47a8f186324a95eaf30d5f6ee9cc0637e7b87d29c7c9b5",
                "sha256:dd705df1b47470388fc4630e4df3cbbe7677e2ab80092a1c660cae630a307b2d",
                "sha256:e87fffa437a4b00afb17af785da9b01618425d6cd984c677639deb937037d8f2",
                "sha256:ed40e0474ab5ab228a8d133759d451b31d3ccdebaff698646e54aff82c3de4f8"
            ],
            "version": "==2018.8.29"
        },
        "requests": {
            "hashes": [
                "sha256:63b52e3c866428a224f97cab011de738c36aec0185aa91cfacd418b5d58911d1",
                "sha256:ec22d826a36ed72a7358ff3fe56cbd4ba69dd7a6718ffd450ff0e9df7a47ce6a"
            ],
            "index": "pypi",
            "version": "==2.19.1"
        },
        "rpi.gpio": {
            "hashes": [
                "sha256:a5fc0eb5e401963b6c0a03650da6b42c4005f02d962b81241d96c98d0a578516"
            ],
            "index": "pypi",
            "version": "==0.6.3"
        },
        "rsa": {
            "hashes": [
                "sha256:25df4e10c263fb88b5ace923dd84bf9aa7f5019687b5e55382ffcdb8bede9db5",
                "sha256:43f682fea81c452c98d09fc316aae12de6d30c4b5c84226642cf8f8fd1c93abd"
            ],
            "version": "==3.4.2"
        },
        "six": {
            "hashes": [
                "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
                "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
            ],
            "version": "==1.11.0"
        },
        "spidev": {
            "hashes": [
                "sha256:09d2b5122f0dd79910713a11f9a0020f71537224bf829916def4fffc0ea59456"
            ],
            "version": "==3.2"
        },
        "spotipy": {
            "hashes": [
                "sha256:4b05da481b5c5dd4d1da8c0f0d13ca805dde037db648d12be866244b19501ed1"
            ],
            "index": "pypi",
            "version": "==2.4.4"
        },
        "tblib": {
            "hashes": [
                "sha256:436e4200e63d92316551179dc540906652878df4ff39b43db30fcf6400444fe7",
                "sha256:9bae4b8c44b06af0e114bfc4d5f6aa3eafd2119af5a4dcab34f51f1665f16c59"
            ],
            "version": "==1.3.2"
        },
        "uritemplate": {
            "hashes": [
                "sha256:01c69f4fe8ed503b2951bef85d996a9d22434d2431584b5b107b2981ff416fbd",
                "sha256:1b9c467a940ce9fb9f50df819e8ddd14696f89b9a8cc87ac77952ba416e0a8fd",
                "sha256:c02643cebe23fc8adb5e6becffe201185bf06c40bda5c0b4028a93f1527d011d"
            ],
            "version": "==3.0.0"
        },
        "urllib3": {
            "hashes": [
                "sha256:a68ac5e15e76e7e5dd2b8f94007233e01effe3e50e8daddf69acfd81cb686baf",
                "sha256:b5725a0bd4ba422ab0e66e89e030c806576753ea3ee08554382c14e685d117b5"
            ],
            "markers": "python_version >= '2.6' and python_version != '3.0.*' and python_version != '3.2.*' and python_version != '3.1.*' and python_version != '3.3.*' and python_version < '4'",
            "version": "==1.23"
        },
        "youtube-dl": {
            "hashes": [
                "sha256:42c2e82280c943ce618969c3ceeea56666554f311e86a8082c72ec91a63885a9",
                "sha256:fc7d1c9e69c44cdf3b11b056d382502e1851bdcd900ff0ced61b6c65d2e4098c"
            ],
            "index": "pypi",
            "version": "==2018.9.8"
        },
        "zproc": {
            "editable": true,
            "git": "https://github.com/pycampers/zproc.git",
            "ref": "0f64ddb5ecf85b299c074f9440ee7be15eebb777"
        }
    },
    "develop": {
        "atom": {
            "hashes": [
                "sha256:0365437952c72843d339c69f679b6cd38ac8f699be56b70086d2c188f090839f",
                "sha256:0c3a8f982a674d6dc0bd637f7f5930662e69b26ad5f2e866aed3a8bcbcd1913b",
                "sha256:13089d12233b11198a1a09372c9f1f24524f26f291d615bb6968bcbdccb0e108",
                "sha256:1afae6b7ef17fb92b1b9cd81960022b89c0112315d7d1eba36f2d42b82aa686a",
                "sha256:243c9ed0be8b668746d9d789ee1aeb8040e5f343639652ddc1da4a1a784500ea",
                "sha256:54d30458e9d1f433911180eaba811b6aab542786d67417fc830a31494a306510",
                "sha256:5dedf4acdec1fced648f4b02aaffa0f6e8e138930334c5ba75874558dca263ca",
                "sha256:5ea08b9da01cf28279e4427821dff6c7d73e11b0ba5af4b8fc9e012435ba3bcd",
                "sha256:60ee794a3068571c7a872bca234e51c57982c5211d420c30561a987192b9c2f8",
                "sha256:6b6fb740789a4a9224045e7c64e851d89179fafe60054b45e449d400910a2762",
                "sha256:74582e79110bfde74839e6bee6c224f8d2c475eea162157a74f536e071b0e5f6",
                "sha256:76b7b25f0d5f0b1dd4f96bcf954d05ba189d376b7c7d7976a4a292864e154e44",
                "sha256:78802f83c83d8478370867dcb2334077342593c7e0270558c26cb862d0463465",
                "sha256:91071f0735e02075f8be72375df8e009e24b12053ccb3d776956ce2194fd0462",
                "sha256:94d30e7913d1cc8707240f32fa25904efa37c09169b66cd41536db8b35d1c3ad",
                "sha256:97bb7f7f8b82ea5855101a1978bf961db4de50d1b87d5e61c2694c7e59aeab43",
                "sha256:a58d568a074996e8fafdad23f2d00dfda7237416b6343fb81c2d3db4ef733024",
                "sha256:b20215353f67e24e4dbd0c8e0cc6c9f3c4a78782e73bcea035250ed59b9b7844",
                "sha256:b89940c78a00008aaf70cba56cdaae653105bfc52b123b9f171ab8dd7f566236",
                "sha256:bbca07d519defbf0d6066a725285a9b30cb8bbf7c880f602f062b83189929f2b",
                "sha256:c5971f8ac8132f5d8cac7092c8910bb4c9f93dcaad0721ebf576ca68636110ce",
                "sha256:e5b2fb5dd7ae8c1bb9d46df1b57465eb31a890d31b45e309f0d17f9dcff49c8d",
                "sha256:f79ed6880f64caa0c5fbfb39f5d2ef3afc01fd94838d4513bc045bf107876f14"
            ],
            "version": "==0.4.1"
        },
        "backcall": {
            "hashes": [
                "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4",
                "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"
            ],
            "version": "==0.1.0"
        },
        "decorator": {
            "hashes": [
                "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82",
                "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c"
            ],
            "version": "==4.3.0"
        },
        "enaml": {
            "hashes": [
                "sha256:02b86079b547990d381b14808ddcc887dbc4b10c0f9487e396547d096ecc7ed4",
                "sha256:06ba3ee2d6b9f73e270013622cdf31a33f948d9728e34510fc0698987c22d0ca",
                "sha256:1ad018b65ef5fa8e1a40d14fa7296edabdaaa6040cb63ad5aee2e32669c60db1",
                "sha256:280a62ae906587929393a0b98e866c0c0e3fe8db9abc1c2da41d5d117e87dd12",
                "sha256:330e66e8266e5709094d2b6666699838dc16f0740b78c6f26e0a94443c6aa0b1",
                "sha256:3e5fd24345c9550d04f1bde98baba15b9c1d9403c0e1660e3bb4bc3306c85de3",
                "sha256:4824e9de26a7c261dfba7d0a59c4f47b4239a49efa69b6f1b0c42afecfd429db",
                "sha256:4daa3c42f3194eac7c699a0a129c358d94ad21aa746c522e823e1ca31b2c9fd8",
                "sha256:5ac759d168083e193ab3dd54d80758dc6b31b0f974367dde65d6771e8e52a4b0",
                "sha256:6c8cfd1dad5df63dc80a187599887148729eb6124d6711086a942cc43a2fe998",
                "sha256:7449209029d5a43e6668bfeb523f53901d78b8561df2687b4a372862751ccc59",
                "sha256:962a3146302c0b63800dfd25e063d044c8f83bd464ad7b49a4e2043e4a59ee6b",
                "sha256:a222dcf695e934611a960bbb7c3850a9a6a0cd48263a30f173c95e779e3a791d",
                "sha256:b1fb9e77698f16d56d4c8451c16320d848818050b19a94cafef7c902ad2d7a14",
                "sha256:d372d76e51f4daa5006d6f896c11bc8b7f85536009945865fbae766f7fc4fd46",
                "sha256:d44fe4795beea975955dd102f09d314a3ee4d67745b4d8a7899782821ea33438",
                "sha256:d5ada10215adad8970509760eb60d607a614ec07dcd38d4c24e5dc5ac1eef0a8",
                "sha256:da4ac5d0e213aa84544b37f3382cff49e8400b44034c2b4d7b868dd92b3b450e",
                "sha256:e271f350062b56153217493d6e64a50428024546a62930b1a2675e935670a618",
                "sha256:e813c5448d0f47fadd91a25a580f364fe93982a88134043995f7a77ab9675d19",
                "sha256:ecd2abd99e429831a3404877910b576d51421d6954a25a267aaa466c20e921b7",
                "sha256:f10e7c711c34f76618f54aa88aafde5e931aba2bbe8ace844f42160676f63007",
                "sha256:f9d8302e7956600053d78f6f43773d8afbcfb72ac6fa3a596882cde66f4622ce"
            ],
            "index": "pypi",
            "version": "==0.10.2"
        },
        "future": {
            "hashes": [
                "sha256:e39ced1ab767b5936646cedba8bcce582398233d6a627067d4c6a454c90cfedb"
            ],
            "version": "==0.16.0"
        },
        "ipython": {
            "hashes": [
                "sha256:007dcd929c14631f83daff35df0147ea51d1af420da303fd078343878bd5fb62",
                "sha256:b0f2ef9eada4a68ef63ee10b6dde4f35c840035c50fd24265f8052c98947d5a4"
            ],
            "index": "pypi",
            "version": "==6.5.0"
        },
        "ipython-genutils": {
            "hashes": [
                "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8",
                "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"
            ],
            "version": "==0.2.0"
        },
        "jedi": {
            "hashes": [
                "sha256:b409ed0f6913a701ed474a614a3bb46e6953639033e31f769ca7581da5bd1ec1",
                "sha256:c254b135fb39ad76e78d4d8f92765ebc9bf92cbc76f49e97ade1d5f5121e1f6f"
            ],
            "version": "==0.12.1"
        },
        "kiwisolver": {
            "hashes": [
                "sha256:0ee4ed8b3ae8f5f712b0aa9ebd2858b5b232f1b9a96b0943dceb34df2a223bc3",
                "sha256:0f7f532f3c94e99545a29f4c3f05637f4d2713e7fd91b4dd8abfc18340b86cd5",
                "sha256:1a078f5dd7e99317098f0e0d490257fd0349d79363e8c923d5bb76428f318421",
                "sha256:1aa0b55a0eb1bd3fa82e704f44fb8f16e26702af1a073cc5030eea399e617b56",
                "sha256:2874060b91e131ceeff00574b7c2140749c9355817a4ed498e82a4ffa308ecbc",
                "sha256:379d97783ba8d2934d52221c833407f20ca287b36d949b4bba6c75274bcf6363",
                "sha256:3b791ddf2aefc56382aadc26ea5b352e86a2921e4e85c31c1f770f527eb06ce4",
                "sha256:4329008a167fac233e398e8a600d1b91539dc33c5a3eadee84c0d4b04d4494fa",
                "sha256:45813e0873bbb679334a161b28cb9606d9665e70561fd6caa8863e279b5e464b",
                "sha256:53a5b27e6b5717bdc0125338a822605084054c80f382051fb945d2c0e6899a20",
                "sha256:574f24b9805cb1c72d02b9f7749aa0cc0b81aa82571be5201aa1453190390ae5",
                "sha256:66f82819ff47fa67a11540da96966fb9245504b7f496034f534b81cacf333861",
                "sha256:79e5fe3ccd5144ae80777e12973027bd2f4f5e3ae8eb286cabe787bed9780138",
                "sha256:83410258eb886f3456714eea4d4304db3a1fc8624623fc3f38a487ab36c0f653",
                "sha256:8b6a7b596ce1d2a6d93c3562f1178ebd3b7bb445b3b0dd33b09f9255e312a965",
                "sha256:9576cb63897fbfa69df60f994082c3f4b8e6adb49cccb60efb2a80a208e6f996",
                "sha256:95a25d9f3449046ecbe9065be8f8380c03c56081bc5d41fe0fb964aaa30b2195",
                "sha256:a424f048bebc4476620e77f3e4d1f282920cef9bc376ba16d0b8fe97eec87cde",
                "sha256:aaec1cfd94f4f3e9a25e144d5b0ed1eb8a9596ec36d7318a504d813412563a85",
                "sha256:acb673eecbae089ea3be3dcf75bfe45fc8d4dcdc951e27d8691887963cf421c7",
                "sha256:b15bc8d2c2848a4a7c04f76c9b3dc3561e95d4dabc6b4f24bfabe5fd81a0b14f",
                "sha256:b1c240d565e977d80c0083404c01e4d59c5772c977fae2c483f100567f50847b",
                "sha256:c595693de998461bcd49b8d20568c8870b3209b8ea323b2a7b0ea86d85864694",
                "sha256:ce3be5d520b4d2c3e5eeb4cd2ef62b9b9ab8ac6b6fedbaa0e39cdb6f50644278",
                "sha256:e0f910f84b35c36a3513b96d816e6442ae138862257ae18a0019d2fc67b041dc",
                "sha256:ea36e19ac0a483eea239320aef0bd40702404ff8c7e42179a2d9d36c5afcb55c",
                "sha256:efabbcd4f406b532206b8801058c8bab9e79645b9880329253ae3322b7b02cd5",
                "sha256:f923406e6b32c86309261b8195e24e18b6a8801df0cfc7814ac44017bfcb3939"
            ],
            "markers": "python_version >= '2.7' and python_version != '3.2.*' and python_version != '3.1.*' and python_version != '3.0.*' and python_version != '3.3.*'",
            "version": "==1.0.1"
        },
        "parso": {
            "hashes": [
                "sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2",
                "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24"
            ],
            "version": "==0.3.1"
        },
        "pexpect": {
            "hashes": [
                "sha256:2a8e88259839571d1251d278476f3eec5db26deb73a70be5ed5dc5435e418aba",
                "sha256:3fbd41d4caf27fa4a377bfd16fef87271099463e6fa73e92a52f92dfee5d425b"
            ],
            "markers": "sys_platform != 'win32'",
            "version": "==4.6.0"
        },
        "pickleshare": {
            "hashes": [
                "sha256:84a9257227dfdd6fe1b4be1319096c20eb85ff1e82c7932f36efccfe1b09737b",
                "sha256:c9a2541f25aeabc070f12f452e1f2a8eae2abd51e1cd19e8430402bdf4c1d8b5"
            ],
            "version": "==0.7.4"
        },
        "ply": {
            "hashes": [
                "sha256:00c7c1aaa88358b9c765b6d3000c6eec0ba42abca5351b095321aef446081da3",
                "sha256:096f9b8350b65ebd2fd1346b12452efe5b9607f7482813ffca50c22722a807ce"
            ],
            "version": "==3.11"
        },
        "prompt-toolkit": {
            "hashes": [
                "sha256:1df952620eccb399c53ebb359cc7d9a8d3a9538cb34c5a1344bdbeb29fbcc381",
                "sha256:3f473ae040ddaa52b52f97f6b4a493cfa9f5920c255a12dc56a7d34397a398a4",
                "sha256:858588f1983ca497f1cf4ffde01d978a3ea02b01c8a26a8bbc5cd2e66d816917"
            ],
            "version": "==1.0.15"
        },
        "ptyprocess": {
            "hashes": [
                "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0",
                "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"
            ],
            "version": "==0.6.0"
        },
        "pygments": {
            "hashes": [
                "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d",
                "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc"
            ],
            "version": "==2.2.0"
        },
        "pyqt5": {
            "hashes": [
                "sha256:700b8bb0357bf0ac312bce283449de733f5773dfc77083664be188c8e964c007",
                "sha256:76d52f3627fac8bfdbc4857ce52a615cd879abd79890cde347682ff9b4b245a2",
                "sha256:7d0f7c0aed9c3ef70d5856e99f30ebcfe25a58300158dd46ee544cbe1c5b53db",
                "sha256:d5dc2faf0aeacd0e8b69af1dc9f1276a64020193148356bb319bdfae22b78f88"
            ],
            "index": "pypi",
            "version": "==5.11.2"
        },
        "pyqt5-sip": {
            "hashes": [
                "sha256:3bcd8efae7798ce41aa7c3a052bd5ce1849f437530b8a717bae39197e780f505",
                "sha256:4a3c5767d6c238d8c62d252ac59312fac8b2264a1e8a5670081d7f3545893005",
                "sha256:67481d70fb0c7fb83e77b9025e15d0e78c7647c228eef934bd20ba716845a519",
                "sha256:7b2e563e4e56adee00101a29913fdcc49cc714f6c4f7eb35449f493c3a88fc45",
                "sha256:92a4950cba7ad7b7f67c09bdf80170ac225b38844b3a10f1271b02bace2ffc64",
                "sha256:9309c10f9e648521cfe03b62f4658dad2314f81886062cb30e0ad31b337e14b0",
                "sha256:9f524e60fa6113b50c48fbd869b2aef19833f3fe278097b1e7403e8f4dd5392c",
                "sha256:a10f59ad65b34e183853e1387b68901f473a2041f7398fac87c4e445ab149830",
                "sha256:abc2b2df469b4efb01d9dba4b804cbf0312f109ed74752dc3a37394a77d55b1f",
                "sha256:c09c17009a2dd2a6317a14d3cea9b2300fdb2206cf9bc4bae0870d1919897935",
                "sha256:c30c162e1430fd5a02207f1bd478e170c61d89fcca11ac6d8babb73cb33a86a8",
                "sha256:f00ceceef75a2140fda737bd30847ac69b7d92fbd32b6ea7b387017e72176bd8"
            ],
            "version": "==4.19.12"
        },
        "qtpy": {
            "hashes": [
                "sha256:2dbac4a848580ae03934e6deb8db65799d4bc52e1b0dd8a789067ab050c2df51",
                "sha256:5a121b42bd88df66c45e7c8d658045acdf63048666a32fb6726a826f8a232e02"
            ],
            "version": "==1.5.0"
        },
        "simplegeneric": {
            "hashes": [
                "sha256:dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"
            ],
            "version": "==0.8.1"
        },
        "six": {
            "hashes": [
                "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9",
                "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb"
            ],
            "version": "==1.11.0"
        },
        "traitlets": {
            "hashes": [
                "sha256:9c4bd2d267b7153df9152698efb1050a5d84982d3384a37b2c1f7723ba3e7835",
                "sha256:c6cb5e6f57c5a9bdaa40fa71ce7b4af30298fbab9ece9815b5d995ab6217c7d9"
            ],
            "version": "==4.3.2"
        },
        "wcwidth": {
            "hashes": [
                "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e",
                "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"
            ],
            "version": "==0.1.7"
        }
    }
}

@nickdani what worked for me with apache-airflow, was:

  • use pipenv version 2018.5.18
  • in Pipfile packages section, specify: apache-airflow = "==1.10.0"
  • run pipenv lock --clear

So, that worked locally.

And, after doing that, I could use the generated Pipfile.lock to re-create the virtual env with the installed airflow packages on another machine, using pipenv install --ignore-pipfile. The downside to that being that if that command is run again, it seems to ignore that the packages are already installed, and installs them again. Or it's just very slow to check that the correct versions are already installed.

I am having a similar problem installing apache-airflow, a simple Pipenv as below fails completely complaining about conflicting click version requirements.

[[source]]
url = "https://pypi.org/simple"
verify_ssl = true
name = "pypi"

[packages]
apache-airflow = {version = "*", extras = ["postgres", "crypto"]}

[dev-packages]

[requires]
python_version = "3.6"

Unfortunately pipenv lock --clear did not help this time. When specifying a requirement for click explicitly, I get a conflict on another module, flask-login.

When installing apache-airflow directly from pip I have no problem as expected.

I'm using the latest pipenv release 2018.7.1. Any ideas?

@gzagatti I'm having the same issue with Airflow. The issue is that Airflow pins flask-login to 0.2.1 but flask-appbuilder is >= 1.11.1, so that pulls in 1.12.0 which requires flask-login >= 0.3. You can pin click==6.7 and flask-appbuilder==1.11.1 BUT that uncovers the nastiest conflict of all which is not resolvable due to some bug in pip-tools (I think). Nowhere in the dependency graph is Jinja2>=2.10 but for some reason that is picked up by pipenv resolver. Since there is indeed a requirement of Jinja2<2.9.0 we find ourselves completely and utterly stuck... cheers! lol

Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  You can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
  Hint: try $ pipenv lock --pre if it is a pre-release dependency.
Could not find a version that matches jinja2<2.9.0,==2.8.1,>=2.10,>=2.4,>=2.5,>=2.7.3,>=2.8
Tried: 2.0, 2.1, 2.1.1, 2.2, 2.2.1, 2.3, 2.3.1, 2.4, 2.4.1, 2.5, 2.5.1, 2.5.2, 2.5.3, 2.5.4, 2.5.5, 2.6, 2.7, 2.7.1, 2.7.2, 2.7.3, 2.8, 2.8, 2.8.1, 2.8.1, 2.9, 2.9, 2.9.1, 2.9.1, 2.9.2, 2.9.2, 2.9.3, 2.9.3, 2.9.4, 2.9.4, 2.9.5, 2.9.5, 2.9.6, 2.9.6, 2.10, 2.10
Skipped pre-versions: 2.0rc1
There are incompatible versions in the resolved dependencies.

@gzagatti @Mokubyow

I've got airflow 1.10 working with something like this and pipenv==2018.5.18.

[requires]
python_version = "2.7"

[packages]
apache-airflow = "==1.10.0"
flask-appbuilder = "==1.11.1"

I also have notes that these were needed:

backports_abc = ">=0.4"
singledispatch = "~=3.4"

@jvstein. Thanks for the useful recommendation. I can report that it has worked for me. I used python_version = "3.6" instead.

I have the issue again with apache-airflow = "==1.10.3". It worked fine, but started to fail about week ago. Dependency resolver complains about jinja2 dependency.
Is there any ongoing work on extracting the resolving mechanism from Poetry?

Me too facing this.

For the airflow folks, poetry worked for me:

https://gist.github.com/jasonnerothin/aaacd3c8aec30bfca991fd04e2847ec9

I also got a similar issue today

pytest = "==3.6.4"
pytest-html = "*"

pytest-html 2.0.0 added a pytest >= 5.0, which ended up failing to lock the Pipfile... When I force pytest-html to go to 1.22.0, it'll work.

I'll add another example, using Pipenv 2018.11.26 (newest release).

These two Pipfile examples fail:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
redis = "~=2.10"
rq = ">=0.8"

[requires]
python_version = "3.8"
[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
redis = "~=2.10"
rq = "~=0.8"

[requires]
python_version = "3.8"

With this error:

[pipenv.exceptions.ResolutionFailure]: Warning: Your dependencies could not be resolved. You likely have a mismatch in your sub-dependencies.
  First try clearing your dependency cache with $ pipenv lock --clear, then try the original command again.
 Alternatively, you can use $ pipenv install --skip-lock to bypass this mechanism, then run $ pipenv graph to inspect the situation.
  Hint: try $ pipenv lock --pre if it is a pre-release dependency.
ERROR: ERROR: Could not find a version that matches redis>=3.0.0,~=2.10
Tried: 0.6.0, 0.6.1, 1.34, 1.34.1, 2.0.0, 2.2.0, 2.2.2, 2.2.4, 2.4.0, 2.4.1, 2.4.2, 2.4.3, 2.4.4, 2.4.5, 2.4.6, 2.4.7, 2.4.8, 2.4.9, 2.4.10, 2.4.11, 2.4.12, 2.4.13, 2.6.0, 2.6.1, 2.6.2, 2.7.0, 2.7.1, 2.7.2, 2.7.3, 2.7.4, 2.7.5, 2.7.6, 2.8.0, 2.9.0, 2.9.1, 2.10.0, 2.10.1, 2.10.2, 2.10.3, 2.10.5, 2.10.5, 2.10.6, 2.10.6, 3.0.0, 3.0.0, 3.0.0.post1, 3.0.0.post1, 3.0.1, 3.0.1, 3.1.0, 3.1.0, 3.2.0, 3.2.0, 3.2.1, 3.2.1, 3.3.0, 3.3.0, 3.3.1, 3.3.1, 3.3.2, 3.3.2, 3.3.3, 3.3.3, 3.3.4, 3.3.4, 3.3.5, 3.3.5, 3.3.6, 3.3.6, 3.3.7, 3.3.7, 3.3.8, 3.3.8, 3.3.9, 3.3.9, 3.3.10, 3.3.10, 3.3.11, 3.3.11, 3.4.0, 3.4.0, 3.4.1, 3.4.1
There are incompatible versions in the resolved dependencies.

This Pipfile works:

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
redis = "~=2.10"
rq = "<0.13,>=0.8"

[requires]
python_version = "3.8"

I resolved this by hand by looking at the setup.py for rq for every release until found the first one that required redis>=3.0.0 (rq 0.13.0).

With a constraint of rq = "~=0.8" or rq = ">=0.8" it should be able to find a valid version or rq (e.g., 0.12.0, 0.8.2, etc.). But I can't, it tries to get 0.13.0 or newer, which isn't compatible with the redis constraint.

Poetry is able to find a solution with the same constraints. I prefer the workflow of Pipenv for application development (Poetry is too library focused). But I've had these incompatible versions in the resolved dependencies errors (that I can resolve by hand) with every large application I've tried to use Pipenv with.

As of the current master branch, the issue mentioned in the original post here is resolved.

@antoncohen the 2nd of your two failing examples works on the current master branch (for me anyway):

[[source]]
name = "pypi"
url = "https://pypi.org/simple"
verify_ssl = true

[dev-packages]

[packages]
redis = "~=2.10"
rq = "~=0.8"

[requires]
python_version = "3.8"

The first example fails because pipenv doesn't use backtracking in it's current solver, so it doesn't understand that it needs to potentially look through all of the possible satisfying versions of each root requirement once it does initial pinning -- so, when you told it to stick with the lower version (via the ~=0.8 pin) it was able to find a satisfying resolution.

For those of you struggling with apache-airflow, I can only hope they have fixed their nightmare of a dependency situation by now. I am no longer deploying airflow at work, but when I was this was also a struggle I had to deal with. I tested this out briefly and it seems like the current release works anyway, though the release in question still fails (because they legitimately have conflicting pins)

I can't say when any of these issues were resolved, only that I thought to have a look recently and was pleasantly surprised. We still have plenty of work to do on this but the situation is dramatically improved.

Thanks for your patience all!

Is there anyway to override the version that has a conflict? I can't find how to set the version of the conflicting package. I tried setting it in the Pipfile but I still get the conflict and I can't generate the lock file.

Was this page helpful?
0 / 5 - 0 ratings