D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
blackhat.pw
:
/
kunden
/
proc
/
self
/
root
/
usr
/
share
/
doc
/
python3-pip
/
html
/
topics
/
Filename :
dependency-resolution.html
back
Copy
<!doctype html> <html class="no-js" lang="en" data-content_root="../"> <head><meta charset="utf-8"/> <meta name="viewport" content="width=device-width,initial-scale=1"/> <meta name="color-scheme" content="light dark"><meta name="viewport" content="width=device-width, initial-scale=1" /> <link rel="search" title="Search" href="../search.html" /><link rel="copyright" title="Copyright" href="../copyright.html" /><link rel="next" title="More on Dependency Resolution" href="more-dependency-resolution.html" /><link rel="prev" title="Configuration" href="configuration.html" /> <!-- Generated with Sphinx 8.1.3 and Furo 2024.08.06 --> <title>Dependency Resolution - pip documentation v25.1.1</title> <link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=a746c00c" /> <link rel="stylesheet" type="text/css" href="../_static/styles/furo.css?v=ad9e2e31" /> <link rel="stylesheet" type="text/css" href="../_static/copybutton.css?v=76b2166b" /> <link rel="stylesheet" type="text/css" href="../_static/tabs.css?v=4c969af8" /> <link rel="stylesheet" type="text/css" href="../_static/styles/furo-extensions.css?v=4aa03575" /> <style> body { --color-code-background: #f8f8f8; --color-code-foreground: black; } @media not print { body[data-theme="dark"] { --color-code-background: #202020; --color-code-foreground: #d0d0d0; } @media (prefers-color-scheme: dark) { body:not([data-theme="light"]) { --color-code-background: #202020; --color-code-foreground: #d0d0d0; } } } </style></head> <body> <script> document.body.dataset.theme = localStorage.getItem("theme") || "auto"; </script> <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <symbol id="svg-toc" viewBox="0 0 24 24"> <title>Contents</title> <svg stroke="currentColor" fill="currentColor" stroke-width="0" viewBox="0 0 1024 1024"> <path d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM115.4 518.9L271.7 642c5.8 4.6 14.4.5 14.4-6.9V388.9c0-7.4-8.5-11.5-14.4-6.9L115.4 505.1a8.74 8.74 0 0 0 0 13.8z"/> </svg> </symbol> <symbol id="svg-menu" viewBox="0 0 24 24"> <title>Menu</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-menu"> <line x1="3" y1="12" x2="21" y2="12"></line> <line x1="3" y1="6" x2="21" y2="6"></line> <line x1="3" y1="18" x2="21" y2="18"></line> </svg> </symbol> <symbol id="svg-arrow-right" viewBox="0 0 24 24"> <title>Expand</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather-chevron-right"> <polyline points="9 18 15 12 9 6"></polyline> </svg> </symbol> <symbol id="svg-sun" viewBox="0 0 24 24"> <title>Light mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="feather-sun"> <circle cx="12" cy="12" r="5"></circle> <line x1="12" y1="1" x2="12" y2="3"></line> <line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line> <line x1="18.36" y1="18.36" x2="19.78" y2="19.78"></line> <line x1="1" y1="12" x2="3" y2="12"></line> <line x1="21" y1="12" x2="23" y2="12"></line> <line x1="4.22" y1="19.78" x2="5.64" y2="18.36"></line> <line x1="18.36" y1="5.64" x2="19.78" y2="4.22"></line> </svg> </symbol> <symbol id="svg-moon" viewBox="0 0 24 24"> <title>Dark mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-moon"> <path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /> </svg> </symbol> <symbol id="svg-sun-with-moon" viewBox="0 0 24 24"> <title>Auto light/dark, in light mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-custom-derived-from-feather-sun-and-tabler-moon"> <path style="opacity: 50%" d="M 5.411 14.504 C 5.471 14.504 5.532 14.504 5.591 14.504 C 3.639 16.319 4.383 19.569 6.931 20.352 C 7.693 20.586 8.512 20.551 9.25 20.252 C 8.023 23.207 4.056 23.725 2.11 21.184 C 0.166 18.642 1.702 14.949 4.874 14.536 C 5.051 14.512 5.231 14.5 5.411 14.5 L 5.411 14.504 Z"/> <line x1="14.5" y1="3.25" x2="14.5" y2="1.25"/> <line x1="14.5" y1="15.85" x2="14.5" y2="17.85"/> <line x1="10.044" y1="5.094" x2="8.63" y2="3.68"/> <line x1="19" y1="14.05" x2="20.414" y2="15.464"/> <line x1="8.2" y1="9.55" x2="6.2" y2="9.55"/> <line x1="20.8" y1="9.55" x2="22.8" y2="9.55"/> <line x1="10.044" y1="14.006" x2="8.63" y2="15.42"/> <line x1="19" y1="5.05" x2="20.414" y2="3.636"/> <circle cx="14.5" cy="9.55" r="3.6"/> </svg> </symbol> <symbol id="svg-moon-with-sun" viewBox="0 0 24 24"> <title>Auto light/dark, in dark mode</title> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-custom-derived-from-feather-sun-and-tabler-moon"> <path d="M 8.282 7.007 C 8.385 7.007 8.494 7.007 8.595 7.007 C 5.18 10.184 6.481 15.869 10.942 17.24 C 12.275 17.648 13.706 17.589 15 17.066 C 12.851 22.236 5.91 23.143 2.505 18.696 C -0.897 14.249 1.791 7.786 7.342 7.063 C 7.652 7.021 7.965 7 8.282 7 L 8.282 7.007 Z"/> <line style="opacity: 50%" x1="18" y1="3.705" x2="18" y2="2.5"/> <line style="opacity: 50%" x1="18" y1="11.295" x2="18" y2="12.5"/> <line style="opacity: 50%" x1="15.316" y1="4.816" x2="14.464" y2="3.964"/> <line style="opacity: 50%" x1="20.711" y1="10.212" x2="21.563" y2="11.063"/> <line style="opacity: 50%" x1="14.205" y1="7.5" x2="13.001" y2="7.5"/> <line style="opacity: 50%" x1="21.795" y1="7.5" x2="23" y2="7.5"/> <line style="opacity: 50%" x1="15.316" y1="10.184" x2="14.464" y2="11.036"/> <line style="opacity: 50%" x1="20.711" y1="4.789" x2="21.563" y2="3.937"/> <circle style="opacity: 50%" cx="18" cy="7.5" r="2.169"/> </svg> </symbol> <symbol id="svg-pencil" viewBox="0 0 24 24"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-pencil-code"> <path d="M4 20h4l10.5 -10.5a2.828 2.828 0 1 0 -4 -4l-10.5 10.5v4" /> <path d="M13.5 6.5l4 4" /> <path d="M20 21l2 -2l-2 -2" /> <path d="M17 17l-2 2l2 2" /> </svg> </symbol> <symbol id="svg-eye" viewBox="0 0 24 24"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1" stroke-linecap="round" stroke-linejoin="round" class="icon-tabler-eye-code"> <path stroke="none" d="M0 0h24v24H0z" fill="none" /> <path d="M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0" /> <path d="M11.11 17.958c-3.209 -.307 -5.91 -2.293 -8.11 -5.958c2.4 -4 5.4 -6 9 -6c3.6 0 6.6 2 9 6c-.21 .352 -.427 .688 -.647 1.008" /> <path d="M20 21l2 -2l-2 -2" /> <path d="M17 17l-2 2l2 2" /> </svg> </symbol> </svg> <input type="checkbox" class="sidebar-toggle" name="__navigation" id="__navigation"> <input type="checkbox" class="sidebar-toggle" name="__toc" id="__toc"> <label class="overlay sidebar-overlay" for="__navigation"> <div class="visually-hidden">Hide navigation sidebar</div> </label> <label class="overlay toc-overlay" for="__toc"> <div class="visually-hidden">Hide table of contents sidebar</div> </label> <a class="skip-to-content muted-link" href="#furo-main-content">Skip to content</a> <div class="page"> <header class="mobile-header"> <div class="header-left"> <label class="nav-overlay-icon" for="__navigation"> <div class="visually-hidden">Toggle site navigation sidebar</div> <i class="icon"><svg><use href="#svg-menu"></use></svg></i> </label> </div> <div class="header-center"> <a href="../index.html"><div class="brand">pip documentation v25.1.1</div></a> </div> <div class="header-right"> <div class="theme-toggle-container theme-toggle-header"> <button class="theme-toggle"> <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div> <svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg> <svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg> <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg> <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg> </button> </div> <label class="toc-overlay-icon toc-header-icon" for="__toc"> <div class="visually-hidden">Toggle table of contents sidebar</div> <i class="icon"><svg><use href="#svg-toc"></use></svg></i> </label> </div> </header> <aside class="sidebar-drawer"> <div class="sidebar-container"> <div class="sidebar-sticky"><a class="sidebar-brand" href="../index.html"> <span class="sidebar-brand-text">pip documentation v25.1.1</span> </a><form class="sidebar-search-container" method="get" action="../search.html" role="search"> <input class="sidebar-search" placeholder="Search" name="q" aria-label="Search"> <input type="hidden" name="check_keywords" value="yes"> <input type="hidden" name="area" value="default"> </form> <div id="searchbox"></div><div class="sidebar-scroll"><div class="sidebar-tree"> <ul class="current"> <li class="toctree-l1"><a class="reference internal" href="../getting-started.html">Getting Started</a></li> <li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li> <li class="toctree-l1"><a class="reference internal" href="../user_guide.html">User Guide</a></li> <li class="toctree-l1 current has-children"><a class="reference internal" href="index.html">Topic Guides</a><input checked="" class="toctree-checkbox" id="toctree-checkbox-1" name="toctree-checkbox-1" role="switch" type="checkbox"/><label for="toctree-checkbox-1"><div class="visually-hidden">Toggle navigation of Topic Guides</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul class="current"> <li class="toctree-l2"><a class="reference internal" href="authentication.html">Authentication</a></li> <li class="toctree-l2"><a class="reference internal" href="caching.html">Caching</a></li> <li class="toctree-l2"><a class="reference internal" href="configuration.html">Configuration</a></li> <li class="toctree-l2 current current-page"><a class="current reference internal" href="#">Dependency Resolution</a></li> <li class="toctree-l2"><a class="reference internal" href="more-dependency-resolution.html">More on Dependency Resolution</a></li> <li class="toctree-l2"><a class="reference internal" href="https-certificates.html">HTTPS Certificates</a></li> <li class="toctree-l2"><a class="reference internal" href="local-project-installs.html">Local project installs</a></li> <li class="toctree-l2"><a class="reference internal" href="repeatable-installs.html">Repeatable Installs</a></li> <li class="toctree-l2"><a class="reference internal" href="secure-installs.html">Secure installs</a></li> <li class="toctree-l2"><a class="reference internal" href="vcs-support.html">VCS Support</a></li> <li class="toctree-l2"><a class="reference internal" href="python-option.html">Managing a different Python interpreter</a></li> <li class="toctree-l2"><a class="reference internal" href="workflow.html">Pip is not a workflow management tool</a></li> </ul> </li> <li class="toctree-l1 has-children"><a class="reference internal" href="../reference/index.html">Reference</a><input class="toctree-checkbox" id="toctree-checkbox-2" name="toctree-checkbox-2" role="switch" type="checkbox"/><label for="toctree-checkbox-2"><div class="visually-hidden">Toggle navigation of Reference</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2 has-children"><a class="reference internal" href="../reference/build-system/index.html">Build System Interface</a><input class="toctree-checkbox" id="toctree-checkbox-3" name="toctree-checkbox-3" role="switch" type="checkbox"/><label for="toctree-checkbox-3"><div class="visually-hidden">Toggle navigation of Build System Interface</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="../reference/build-system/pyproject-toml.html"><code class="docutils literal notranslate"><span class="pre">pyproject.toml</span></code></a></li> <li class="toctree-l3"><a class="reference internal" href="../reference/build-system/setup-py.html"><code class="docutils literal notranslate"><span class="pre">setup.py</span></code> (legacy)</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../reference/requirement-specifiers.html">Requirement Specifiers</a></li> <li class="toctree-l2"><a class="reference internal" href="../reference/requirements-file-format.html">Requirements File Format</a></li> <li class="toctree-l2"><a class="reference internal" href="../reference/installation-report.html">Installation Report</a></li> <li class="toctree-l2"><a class="reference internal" href="../reference/inspect-report.html"><code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">inspect</span></code> JSON output specification</a></li> </ul> </li> <li class="toctree-l1 has-children"><a class="reference internal" href="../cli/index.html">Commands</a><input class="toctree-checkbox" id="toctree-checkbox-4" name="toctree-checkbox-4" role="switch" type="checkbox"/><label for="toctree-checkbox-4"><div class="visually-hidden">Toggle navigation of Commands</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2"><a class="reference internal" href="../cli/pip.html">pip</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_install.html">pip install</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_uninstall.html">pip uninstall</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_inspect.html">pip inspect</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_list.html">pip list</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_show.html">pip show</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_freeze.html">pip freeze</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_check.html">pip check</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_lock.html">pip lock</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_download.html">pip download</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_wheel.html">pip wheel</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_hash.html">pip hash</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_search.html">pip search</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_index.html">pip index</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_cache.html">pip cache</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_config.html">pip config</a></li> <li class="toctree-l2"><a class="reference internal" href="../cli/pip_debug.html">pip debug</a></li> </ul> </li> </ul> <p class="caption" role="heading"><span class="caption-text">Project</span></p> <ul> <li class="toctree-l1 has-children"><a class="reference internal" href="../development/index.html">Development</a><input class="toctree-checkbox" id="toctree-checkbox-5" name="toctree-checkbox-5" role="switch" type="checkbox"/><label for="toctree-checkbox-5"><div class="visually-hidden">Toggle navigation of Development</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2"><a class="reference internal" href="../development/getting-started.html">Getting Started</a></li> <li class="toctree-l2"><a class="reference internal" href="../development/contributing.html">Contributing</a></li> <li class="toctree-l2"><a class="reference internal" href="../development/ci.html">Continuous Integration</a></li> <li class="toctree-l2"><a class="reference internal" href="../development/issue-triage.html">Issue Triage</a></li> <li class="toctree-l2 has-children"><a class="reference internal" href="../development/architecture/index.html">Architecture of pip’s internals</a><input class="toctree-checkbox" id="toctree-checkbox-6" name="toctree-checkbox-6" role="switch" type="checkbox"/><label for="toctree-checkbox-6"><div class="visually-hidden">Toggle navigation of Architecture of pip’s internals</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="../development/architecture/overview.html">Broad functionality overview</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/architecture/anatomy.html">Repository anatomy & directory structure</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/architecture/configuration-files.html">Configuration File Handling</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/architecture/package-finding.html">Finding and choosing files (<code class="docutils literal notranslate"><span class="pre">index</span></code> and <code class="docutils literal notranslate"><span class="pre">PackageFinder</span></code>)</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/architecture/command-line-interface.html">Command Line Interface</a></li> <li class="toctree-l3"><a class="reference internal" href="../development/architecture/upgrade-options.html">Options that control the installation process</a></li> </ul> </li> <li class="toctree-l2"><a class="reference internal" href="../development/release-process.html">Release process</a></li> <li class="toctree-l2"><a class="reference internal" href="../development/vendoring-policy.html">Vendoring Policy</a></li> </ul> </li> <li class="toctree-l1 has-children"><a class="reference internal" href="../ux-research-design/index.html">UX Research & Design</a><input class="toctree-checkbox" id="toctree-checkbox-7" name="toctree-checkbox-7" role="switch" type="checkbox"/><label for="toctree-checkbox-7"><div class="visually-hidden">Toggle navigation of UX Research & Design</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l2"><a class="reference internal" href="../ux-research-design/contribute.html">How to Contribute</a></li> <li class="toctree-l2"><a class="reference internal" href="../ux-research-design/guidance.html">UX Guidance</a></li> <li class="toctree-l2 has-children"><a class="reference internal" href="../ux-research-design/research-results/index.html">UX Research Results</a><input class="toctree-checkbox" id="toctree-checkbox-8" name="toctree-checkbox-8" role="switch" type="checkbox"/><label for="toctree-checkbox-8"><div class="visually-hidden">Toggle navigation of UX Research Results</div><i class="icon"><svg><use href="#svg-arrow-right"></use></svg></i></label><ul> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/about-our-users.html">About pip’s Users</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/mental-models.html">How Users Understand pip</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/users-and-security.html">How pip users think about security</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/ci-cd.html">How pip is used in interactive environments (i.e. CI, CD)</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/personas.html">pip Personas</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/prioritizing-features.html">Prioritizing pip Features</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/override-conflicting-dependencies.html">Providing an override to install packages with conflicting dependencies</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/pip-force-reinstall.html">pip --force-reinstall</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/pip-search.html">pip search</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/pip-upgrade-conflict.html">pip Upgrade Conflict</a></li> <li class="toctree-l3"><a class="reference internal" href="../ux-research-design/research-results/improving-pips-documentation.html">Improving pip’s Documentation</a></li> </ul> </li> </ul> </li> <li class="toctree-l1"><a class="reference internal" href="../news.html">Changelog</a></li> <li class="toctree-l1"><a class="reference external" href="https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md">Code of Conduct</a></li> <li class="toctree-l1"><a class="reference external" href="https://github.com/pypa/pip">GitHub</a></li> </ul> </div> </div> </div> </div> </aside> <div class="main"> <div class="content"> <div class="article-container"> <a href="#" class="back-to-top muted-link"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> <path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12z"></path> </svg> <span>Back to top</span> </a> <div class="content-icon-container"> <div class="view-this-page"> <a class="muted-link" href="../_sources/topics/dependency-resolution.md.txt" title="View this page"> <svg><use href="#svg-eye"></use></svg> <span class="visually-hidden">View this page</span> </a> </div> <div class="theme-toggle-container theme-toggle-content"> <button class="theme-toggle"> <div class="visually-hidden">Toggle Light / Dark / Auto color theme</div> <svg class="theme-icon-when-auto-light"><use href="#svg-sun-with-moon"></use></svg> <svg class="theme-icon-when-auto-dark"><use href="#svg-moon-with-sun"></use></svg> <svg class="theme-icon-when-dark"><use href="#svg-moon"></use></svg> <svg class="theme-icon-when-light"><use href="#svg-sun"></use></svg> </button> </div> <label class="toc-overlay-icon toc-content-icon" for="__toc"> <div class="visually-hidden">Toggle table of contents sidebar</div> <i class="icon"><svg><use href="#svg-toc"></use></svg></i> </label> </div> <article role="main" id="furo-main-content"> <section id="dependency-resolution"> <h1>Dependency Resolution<a class="headerlink" href="#dependency-resolution" title="Link to this heading">¶</a></h1> <p>pip is capable of determining and installing the dependencies of packages. The process of determining which version of a dependency to install is known as dependency resolution. This behaviour can be disabled by passing <a class="reference internal" href="../cli/pip_download.html#cmdoption-no-deps"><code class="xref any std std-option docutils literal notranslate"><span class="pre">--no-deps</span></code></a> to <a class="reference internal" href="../cli/pip_install.html#pip-install"><span class="std std-ref">pip install</span></a>.</p> <section id="how-it-works"> <h2>How it works<a class="headerlink" href="#how-it-works" title="Link to this heading">¶</a></h2> <p>When a user does a <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code> (e.g. <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">tea</span></code>), pip needs to work out the package’s dependencies (e.g. <code class="docutils literal notranslate"><span class="pre">spoon</span></code>, <code class="docutils literal notranslate"><span class="pre">hot-water</span></code>, <code class="docutils literal notranslate"><span class="pre">tea-leaves</span></code> etc.) and what the versions of each of those dependencies it should install.</p> <p>At the start of a <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span></code> run, pip does not have all the dependency information of the requested packages. It needs to work out the dependencies of the requested packages, the dependencies of those dependencies, and so on. Over the course of the dependency resolution process, pip will need to download distribution files of the packages which are used to get the dependencies of a package.</p> </section> <section id="backtracking"> <h2>Backtracking<a class="headerlink" href="#backtracking" title="Link to this heading">¶</a></h2> <div class="versionchanged"> <p><span class="versionmodified changed">Changed in version 20.3: </span>pip’s dependency resolver is now capable of backtracking.</p> </div> <p>During dependency resolution, pip needs to make assumptions about the package versions it needs to install and, later, check these assumptions were not incorrect. When pip finds that an assumption it made earlier is incorrect, it has to backtrack, which means also discarding some of the work that has already been done, and going back to choose another path.</p> <p>This can look like pip downloading multiple versions of the same package, since pip explicitly presents each download to the user. The backtracking of choices made during this step is not unexpected behaviour or a bug. It is part of how dependency resolution for Python packages works.</p> <div class="admonition-example admonition"> <p class="admonition-title">Example</p> <p>The user requests <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">tea</span></code>. The package <code class="docutils literal notranslate"><span class="pre">tea</span></code> declares a dependency on <code class="docutils literal notranslate"><span class="pre">hot-water</span></code>, <code class="docutils literal notranslate"><span class="pre">spoon</span></code>, <code class="docutils literal notranslate"><span class="pre">cup</span></code>, amongst others.</p> <p>pip starts by picking the most recent version of <code class="docutils literal notranslate"><span class="pre">tea</span></code> and gets the list of dependencies of that version of <code class="docutils literal notranslate"><span class="pre">tea</span></code>. It will then repeat the process for those packages, picking the most recent version of <code class="docutils literal notranslate"><span class="pre">spoon</span></code> and then <code class="docutils literal notranslate"><span class="pre">cup</span></code>. Now, pip notices that the version of <code class="docutils literal notranslate"><span class="pre">cup</span></code> it has chosen is not compatible with the version of <code class="docutils literal notranslate"><span class="pre">spoon</span></code> it has chosen. Thus, pip will “go back” (backtrack) and try to use another version of <code class="docutils literal notranslate"><span class="pre">cup</span></code>. If it is successful, it will continue onto the next package (like <code class="docutils literal notranslate"><span class="pre">sugar</span></code>). Otherwise, it will continue to backtrack on <code class="docutils literal notranslate"><span class="pre">cup</span></code> until it finds a version of <code class="docutils literal notranslate"><span class="pre">cup</span></code> that is compatible with all the other packages.</p> <p>This can look like:</p> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>pip<span class="w"> </span>install<span class="w"> </span>tea <span class="go">Collecting tea</span> <span class="go"> Downloading tea-1.9.8-py2.py3-none-any.whl (346 kB)</span> <span class="go"> |████████████████████████████████| 346 kB 10.4 MB/s</span> <span class="go">Collecting spoon==2.27.0</span> <span class="go"> Downloading spoon-2.27.0-py2.py3-none-any.whl (312 kB)</span> <span class="go"> |████████████████████████████████| 312 kB 19.2 MB/s</span> <span class="go">Collecting cup>=1.6.0</span> <span class="go"> Downloading cup-3.22.0-py2.py3-none-any.whl (397 kB)</span> <span class="go"> |████████████████████████████████| 397 kB 28.2 MB/s</span> <span class="go">INFO: pip is looking at multiple versions of this package to determine</span> <span class="go">which version is compatible with other requirements.</span> <span class="go">This could take a while.</span> <span class="go"> Downloading cup-3.21.0-py2.py3-none-any.whl (395 kB)</span> <span class="go"> |████████████████████████████████| 395 kB 27.0 MB/s</span> <span class="go"> Downloading cup-3.20.0-py2.py3-none-any.whl (394 kB)</span> <span class="go"> |████████████████████████████████| 394 kB 24.4 MB/s</span> <span class="go"> Downloading cup-3.19.1-py2.py3-none-any.whl (394 kB)</span> <span class="go"> |████████████████████████████████| 394 kB 21.3 MB/s</span> <span class="go"> Downloading cup-3.19.0-py2.py3-none-any.whl (394 kB)</span> <span class="go"> |████████████████████████████████| 394 kB 26.2 MB/s</span> <span class="go"> Downloading cup-3.18.0-py2.py3-none-any.whl (393 kB)</span> <span class="go"> |████████████████████████████████| 393 kB 22.1 MB/s</span> <span class="go"> Downloading cup-3.17.0-py2.py3-none-any.whl (382 kB)</span> <span class="go"> |████████████████████████████████| 382 kB 23.8 MB/s</span> <span class="go"> Downloading cup-3.16.0-py2.py3-none-any.whl (376 kB)</span> <span class="go"> |████████████████████████████████| 376 kB 27.5 MB/s</span> <span class="go"> Downloading cup-3.15.1-py2.py3-none-any.whl (385 kB)</span> <span class="go"> |████████████████████████████████| 385 kB 30.4 MB/s</span> <span class="go">INFO: pip is looking at multiple versions of this package to determine</span> <span class="go">which version is compatible with other requirements.</span> <span class="go">This could take a while.</span> <span class="go"> Downloading cup-3.15.0-py2.py3-none-any.whl (378 kB)</span> <span class="go"> |████████████████████████████████| 378 kB 21.4 MB/s</span> <span class="go"> Downloading cup-3.14.0-py2.py3-none-any.whl (372 kB)</span> <span class="go"> |████████████████████████████████| 372 kB 21.1 MB/s</span> </pre></div> </div> <p>These multiple <code class="docutils literal notranslate"><span class="pre">Downloading</span> <span class="pre">cup-{version}</span></code> lines show that pip is backtracking choices it is making during dependency resolution.</p> </div> <p>If pip starts backtracking during dependency resolution, it does not know how many choices it will reconsider, and how much computation would be needed.</p> <p>For the user, this means it can take a long time to complete when pip starts backtracking. In the case where a package has a lot of versions, arriving at a good candidate can take a lot of time. The amount of time depends on the package size, the number of versions pip must try, and various other factors.</p> <p>Backtracking reduces the risk that installing a new package will accidentally break an existing installed package, and so reduces the risk that your environment gets messed up. To do this, pip has to do more work, to find out which version of a package is a good candidate to install.</p> </section> <section id="possible-ways-to-reduce-backtracking"> <h2>Possible ways to reduce backtracking<a class="headerlink" href="#possible-ways-to-reduce-backtracking" title="Link to this heading">¶</a></h2> <p>There is no one-size-fits-all answer to situations where pip is backtracking excessively during dependency resolution. There are ways to reduce the degree to which pip might backtrack though. Nearly all of these approaches require some amount of trial and error.</p> <section id="allow-pip-to-complete-its-backtracking"> <h3>Allow pip to complete its backtracking<a class="headerlink" href="#allow-pip-to-complete-its-backtracking" title="Link to this heading">¶</a></h3> <p>In most cases, pip will complete the backtracking process successfully. This could take a very long time to complete, so this may not be your preferred option.</p> <p>However, it is a possible that pip will not be able to find a set of compatible versions. For this, pip will try every possible combination that it needs to and determine that there is no compatible set.</p> <p>If you’d prefer not to wait, you can interrupt pip (Ctrl+c) and try the strategies listed below.</p> </section> <section id="reduce-the-number-of-versions-pip-is-trying-to-use"> <h3>Reduce the number of versions pip is trying to use<a class="headerlink" href="#reduce-the-number-of-versions-pip-is-trying-to-use" title="Link to this heading">¶</a></h3> <p>It is usually a good idea to add constraints the package(s) that pip is backtracking on (e.g. in the above example - <code class="docutils literal notranslate"><span class="pre">cup</span></code>).</p> <p>You could try something like:</p> <p><div class="tab-set docutils"> <input checked="True" class="tab-input" id="tab-set--0-input--1" name="tab-set--0" type="radio"><label class="tab-label" for="tab-set--0-input--1">Linux</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>tea<span class="w"> </span><span class="s2">"cup >= 3.13"</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--0-input--2" name="tab-set--0" type="radio"><label class="tab-label" for="tab-set--0-input--2">MacOS</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>tea<span class="w"> </span><span class="s2">"cup >= 3.13"</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--0-input--3" name="tab-set--0" type="radio"><label class="tab-label" for="tab-set--0-input--3">Windows</label><div class="tab-content docutils"> <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:></span> py -m pip install tea <span class="s2">"cup >= 3.13"</span> </pre></div> </div> </div> </div> </p> <p>This will reduce the number of versions of <code class="docutils literal notranslate"><span class="pre">cup</span></code> it tries, and possibly reduce the time pip takes to install.</p> <p>There is a possibility that the addition constraint is incorrect. When this happens, the reduced search space makes it easier for pip to more quickly determine what caused the conflict and present that to the user. It could also result in pip backtracking on a different package due to some other conflict.</p> </section> <section id="use-constraint-files-or-lockfiles"> <h3>Use constraint files or lockfiles<a class="headerlink" href="#use-constraint-files-or-lockfiles" title="Link to this heading">¶</a></h3> <p>This option is a progression of the previous section. It requires users to know how to inspect:</p> <ul class="simple"> <li><p>the packages they’re trying to install</p></li> <li><p>the package release frequency and compatibility policies</p></li> <li><p>their release notes and changelogs from past versions</p></li> </ul> <p>During deployment, you can create a lockfile stating the exact package and version number for each dependency of that package. You can create this with <a class="reference external" href="https://github.com/jazzband/pip-tools/">pip-tools</a>.</p> <p>This means the “work” is done once during development process, and thus will avoid performing dependency resolution during deployment.</p> </section> </section> <section id="dealing-with-dependency-conflicts"> <span id="fixing-conflicting-dependencies"></span><h2>Dealing with dependency conflicts<a class="headerlink" href="#dealing-with-dependency-conflicts" title="Link to this heading">¶</a></h2> <p>This section provides practical suggestions to pip users who encounter a <code class="docutils literal notranslate"><span class="pre">ResolutionImpossible</span></code> error, where pip cannot install their specified packages due to conflicting dependencies.</p> <section id="understanding-your-error-message"> <h3>Understanding your error message<a class="headerlink" href="#understanding-your-error-message" title="Link to this heading">¶</a></h3> <p>When you get a <code class="docutils literal notranslate"><span class="pre">ResolutionImpossible</span></code> error, you might see something like this:</p> <p><div class="tab-set docutils"> <input checked="True" class="tab-input" id="tab-set--1-input--1" name="tab-set--1" type="radio"><label class="tab-label" for="tab-set--1-input--1">Linux</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="nv">package_coffee</span><span class="o">==</span><span class="m">0</span>.44.1<span class="w"> </span><span class="nv">package_tea</span><span class="o">==</span><span class="m">4</span>.3.0 <span class="go">[regular pip output]</span> <span class="go">ERROR: Cannot install package_coffee==0.44.1 and package_tea==4.3.0 because these package versions have conflicting dependencies.</span> <span class="go">The conflict is caused by:</span> <span class="go"> package_coffee 0.44.1 depends on package_water<3.0.0,>=2.4.2</span> <span class="go"> package_tea 4.3.0 depends on package_water==2.3.1</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--1-input--2" name="tab-set--1" type="radio"><label class="tab-label" for="tab-set--1-input--2">MacOS</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="nv">package_coffee</span><span class="o">==</span><span class="m">0</span>.44.1<span class="w"> </span><span class="nv">package_tea</span><span class="o">==</span><span class="m">4</span>.3.0 <span class="go">[regular pip output]</span> <span class="go">ERROR: Cannot install package_coffee==0.44.1 and package_tea==4.3.0 because these package versions have conflicting dependencies.</span> <span class="go">The conflict is caused by:</span> <span class="go"> package_coffee 0.44.1 depends on package_water<3.0.0,>=2.4.2</span> <span class="go"> package_tea 4.3.0 depends on package_water==2.3.1</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--1-input--3" name="tab-set--1" type="radio"><label class="tab-label" for="tab-set--1-input--3">Windows</label><div class="tab-content docutils"> <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:></span> py -m pip install package_coffee==0.44.1 package_tea==4.3.0 <span class="go">[regular pip output]</span> <span class="go">ERROR: Cannot install package_coffee==0.44.1 and package_tea==4.3.0 because these package versions have conflicting dependencies.</span> <span class="go">The conflict is caused by:</span> <span class="gp"> package_coffee 0.44.1 depends on package_water<3.0.0,></span>=2.4.2 <span class="go"> package_tea 4.3.0 depends on package_water==2.3.1</span> </pre></div> </div> </div> </div> </p> <p>In this example, pip cannot install the packages you have requested, because they each depend on different versions of the same package (<code class="docutils literal notranslate"><span class="pre">package_water</span></code>):</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">package_coffee</span></code> version <code class="docutils literal notranslate"><span class="pre">0.44.1</span></code> depends on a version of <code class="docutils literal notranslate"><span class="pre">package_water</span></code> that is less than <code class="docutils literal notranslate"><span class="pre">3.0.0</span></code> but greater than or equal to <code class="docutils literal notranslate"><span class="pre">2.4.2</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">package_tea</span></code> version <code class="docutils literal notranslate"><span class="pre">4.3.0</span></code> depends on version <code class="docutils literal notranslate"><span class="pre">2.3.1</span></code> of <code class="docutils literal notranslate"><span class="pre">package_water</span></code></p></li> </ul> <p>Sometimes these messages are straightforward to read, because they use commonly understood comparison operators to specify the required version (e.g. <code class="docutils literal notranslate"><span class="pre"><</span></code> or <code class="docutils literal notranslate"><span class="pre">></span></code>).</p> <p>However, Python packaging also supports some more complex ways for specifying package versions (e.g. <code class="docutils literal notranslate"><span class="pre">~=</span></code> or <code class="docutils literal notranslate"><span class="pre">*</span></code>):</p> <div class="table-wrapper colwidths-auto docutils container"> <table class="docutils align-default"> <thead> <tr class="row-odd"><th class="head"><p>Operator</p></th> <th class="head"><p>Description</p></th> <th class="head"><p>Example</p></th> </tr> </thead> <tbody> <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">></span></code></p></td> <td><p>Any version greater than the specified version.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre">>3.1</span></code>: any version greater than <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre"><</span></code></p></td> <td><p>Any version less than the specified version.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre"><3.1</span></code>: any version less than <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre"><=</span></code></p></td> <td><p>Any version less than or equal to the specified version.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre"><=3.1</span></code>: any version less than or equal to <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">>=</span></code></p></td> <td><p>Any version greater than or equal to the specified version.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre">>=3.1</span></code>: any version greater than or equal to <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">==</span></code></p></td> <td><p>Exactly the specified version.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre">==3.1</span></code>: only version <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">!=</span></code></p></td> <td><p>Any version not equal to the specified version.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre">!=3.1</span></code>: any version other than <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> <tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">~=</span></code></p></td> <td><p>Any compatible<sup>1</sup> version.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre">~=3.1</span></code>: any version compatible<sup>1</sup> with <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> <tr class="row-odd"><td><p><code class="docutils literal notranslate"><span class="pre">*</span></code></p></td> <td><p>Can be used at the end of a version number to represent <em>all</em>.</p></td> <td><p><code class="docutils literal notranslate"><span class="pre">==3.1.*</span></code>: any version that starts with <code class="docutils literal notranslate"><span class="pre">3.1</span></code>.</p></td> </tr> </tbody> </table> </div> <p><sup>1</sup> Compatible versions are higher versions that only differ in the final segment. <code class="docutils literal notranslate"><span class="pre">~=3.1.2</span></code> is equivalent to <code class="docutils literal notranslate"><span class="pre">>=3.1.2,</span> <span class="pre">==3.1.*</span></code>. <code class="docutils literal notranslate"><span class="pre">~=3.1</span></code> is equivalent to <code class="docutils literal notranslate"><span class="pre">>=3.1,</span> <span class="pre">==3.*</span></code>.</p> <p>The detailed specification of supported comparison operators can be found in <span class="target" id="index-0"></span><a class="pep reference external" href="https://peps.python.org/pep-0440/"><strong>PEP 440</strong></a>.</p> </section> <section id="possible-solutions"> <h3>Possible solutions<a class="headerlink" href="#possible-solutions" title="Link to this heading">¶</a></h3> <p>The solution to your error will depend on your individual use case. Here are some things to try:</p> <section id="audit-your-top-level-requirements"> <h4>Audit your top level requirements<a class="headerlink" href="#audit-your-top-level-requirements" title="Link to this heading">¶</a></h4> <p>As a first step, it is useful to audit your project and remove any unnecessary or out of date requirements (e.g. from your <code class="docutils literal notranslate"><span class="pre">setup.py</span></code> or <code class="docutils literal notranslate"><span class="pre">requirements.txt</span></code> files). Removing these can significantly reduce the complexity of your dependency tree, thereby reducing opportunities for conflicts to occur.</p> </section> <section id="loosen-your-top-level-requirements"> <h4>Loosen your top level requirements<a class="headerlink" href="#loosen-your-top-level-requirements" title="Link to this heading">¶</a></h4> <p>Sometimes the packages that you have asked pip to install are incompatible because you have been too strict when you specified the package version.</p> <p>In our first example both <code class="docutils literal notranslate"><span class="pre">package_coffee</span></code> and <code class="docutils literal notranslate"><span class="pre">package_tea</span></code> have been <em>pinned</em> to use specific versions (<code class="docutils literal notranslate"><span class="pre">package_coffee==0.44.1</span> <span class="pre">package_tea==4.3.0</span></code>).</p> <p>To find a version of both <code class="docutils literal notranslate"><span class="pre">package_coffee</span></code> and <code class="docutils literal notranslate"><span class="pre">package_tea</span></code> that depend on the same version of <code class="docutils literal notranslate"><span class="pre">package_water</span></code>, you might consider:</p> <ul class="simple"> <li><p>Loosening the range of packages that you are prepared to install (e.g. <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">"package_coffee>0.44"</span> <span class="pre">"package_tea>4.0.0"</span></code>)</p></li> <li><p>Asking pip to install <em>any</em> version of <code class="docutils literal notranslate"><span class="pre">package_coffee</span></code> and <code class="docutils literal notranslate"><span class="pre">package_tea</span></code> by removing the version specifiers altogether (e.g. <code class="docutils literal notranslate"><span class="pre">pip</span> <span class="pre">install</span> <span class="pre">package_coffee</span> <span class="pre">package_tea</span></code>)</p></li> </ul> <p>In the second case, pip will automatically find a version of both <code class="docutils literal notranslate"><span class="pre">package_coffee</span></code> and <code class="docutils literal notranslate"><span class="pre">package_tea</span></code> that depend on the same version of <code class="docutils literal notranslate"><span class="pre">package_water</span></code>, installing:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">package_coffee</span> <span class="pre">0.44.1</span></code>, which depends on <code class="docutils literal notranslate"><span class="pre">package_water</span> <span class="pre">2.6.1</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">package_tea</span> <span class="pre">4.4.3</span></code> which <em>also</em> depends on <code class="docutils literal notranslate"><span class="pre">package_water</span> <span class="pre">2.6.1</span></code></p></li> </ul> <p>If you want to prioritize one package over another, you can add version specifiers to <em>only</em> the more important package:</p> <p><div class="tab-set docutils"> <input checked="True" class="tab-input" id="tab-set--2-input--1" name="tab-set--2" type="radio"><label class="tab-label" for="tab-set--2-input--1">Linux</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="nv">package_coffee</span><span class="o">==</span><span class="m">0</span>.44.1<span class="w"> </span>package_tea </pre></div> </div> </div> <input class="tab-input" id="tab-set--2-input--2" name="tab-set--2" type="radio"><label class="tab-label" for="tab-set--2-input--2">MacOS</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="nv">package_coffee</span><span class="o">==</span><span class="m">0</span>.44.1<span class="w"> </span>package_tea </pre></div> </div> </div> <input class="tab-input" id="tab-set--2-input--3" name="tab-set--2" type="radio"><label class="tab-label" for="tab-set--2-input--3">Windows</label><div class="tab-content docutils"> <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:></span> py -m pip install package_coffee==0.44.1 package_tea </pre></div> </div> </div> </div> </p> <p>This will result in:</p> <ul class="simple"> <li><p><code class="docutils literal notranslate"><span class="pre">package_coffee</span> <span class="pre">0.44.1</span></code>, which depends on <code class="docutils literal notranslate"><span class="pre">package_water</span> <span class="pre">2.6.1</span></code></p></li> <li><p><code class="docutils literal notranslate"><span class="pre">package_tea</span> <span class="pre">4.4.3</span></code> which <em>also</em> depends on <code class="docutils literal notranslate"><span class="pre">package_water</span> <span class="pre">2.6.1</span></code></p></li> </ul> <p>Now that you have resolved the issue, you can repin the compatible package versions as required.</p> </section> <section id="loosen-the-requirements-of-your-dependencies"> <h4>Loosen the requirements of your dependencies<a class="headerlink" href="#loosen-the-requirements-of-your-dependencies" title="Link to this heading">¶</a></h4> <p>Assuming that you cannot resolve the conflict by loosening the version of the package you require (as above), you can try to fix the issue on your <em>dependency</em> by:</p> <ul class="simple"> <li><p>Requesting that the package maintainers loosen <em>their</em> dependencies</p></li> <li><p>Forking the package and loosening the dependencies yourself</p></li> </ul> <div class="admonition warning"> <p class="admonition-title">Warning</p> <p>If you choose to fork the package yourself, you are <em>opting out</em> of any support provided by the package maintainers. Proceed at your own risk!</p> </div> </section> <section id="all-requirements-are-appropriate-but-a-solution-does-not-exist"> <h4>All requirements are appropriate, but a solution does not exist<a class="headerlink" href="#all-requirements-are-appropriate-but-a-solution-does-not-exist" title="Link to this heading">¶</a></h4> <p>Sometimes it’s simply impossible to find a combination of package versions that do not conflict. Welcome to <a class="reference external" href="https://en.wikipedia.org/wiki/Dependency_hell">dependency hell</a>.</p> <p>In this situation, you could consider:</p> <ul class="simple"> <li><p>Using an alternative package, if that is acceptable for your project. See <a class="reference external" href="https://python.libhunt.com/">Awesome Python</a> for similar packages.</p></li> <li><p>Refactoring your project to reduce the number of dependencies (for example, by breaking up a monolithic code base into smaller pieces).</p></li> </ul> </section> </section> </section> <section id="handling-resolution-too-deep-errors"> <h2>Handling Resolution Too Deep Errors<a class="headerlink" href="#handling-resolution-too-deep-errors" title="Link to this heading">¶</a></h2> <p>Sometimes pip’s dependency resolver may exceed its search depth and terminate with a <code class="docutils literal notranslate"><span class="pre">ResolutionTooDeepError</span></code> exception. This typically occurs when the dependency graph is extremely complex or when there are too many package versions to evaluate.</p> <p>To address this error, consider the following strategies:</p> <section id="specify-reasonable-lower-bounds"> <h3>Specify Reasonable Lower Bounds<a class="headerlink" href="#specify-reasonable-lower-bounds" title="Link to this heading">¶</a></h3> <p>By setting a higher lower bound for your dependencies, you narrow the search space. This excludes older versions that might trigger excessive backtracking. For example:</p> <p><div class="tab-set docutils"> <input checked="True" class="tab-input" id="tab-set--3-input--1" name="tab-set--3" type="radio"><label class="tab-label" for="tab-set--3-input--1">Linux</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">"package_coffee>=0.44.0"</span><span class="w"> </span><span class="s2">"package_tea>=4.0.0"</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--3-input--2" name="tab-set--3" type="radio"><label class="tab-label" for="tab-set--3-input--2">MacOS</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">"package_coffee>=0.44.0"</span><span class="w"> </span><span class="s2">"package_tea>=4.0.0"</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--3-input--3" name="tab-set--3" type="radio"><label class="tab-label" for="tab-set--3-input--3">Windows</label><div class="tab-content docutils"> <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:></span> py -m pip install <span class="s2">"package_coffee>=0.44.0"</span> <span class="s2">"package_tea>=4.0.0"</span> </pre></div> </div> </div> </div> </p> </section> <section id="use-the-upgrade-flag"> <h3>Use the <code class="docutils literal notranslate"><span class="pre">--upgrade</span></code> Flag<a class="headerlink" href="#use-the-upgrade-flag" title="Link to this heading">¶</a></h3> <p>The <code class="docutils literal notranslate"><span class="pre">--upgrade</span></code> flag directs pip to ignore already installed versions and search for the latest versions that meet your requirements. This can help avoid unnecessary resolution paths:</p> <p><div class="tab-set docutils"> <input checked="True" class="tab-input" id="tab-set--4-input--1" name="tab-set--4" type="radio"><label class="tab-label" for="tab-set--4-input--1">Linux</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>--upgrade<span class="w"> </span>package_coffee<span class="w"> </span>package_tea </pre></div> </div> </div> <input class="tab-input" id="tab-set--4-input--2" name="tab-set--4" type="radio"><label class="tab-label" for="tab-set--4-input--2">MacOS</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>--upgrade<span class="w"> </span>package_coffee<span class="w"> </span>package_tea </pre></div> </div> </div> <input class="tab-input" id="tab-set--4-input--3" name="tab-set--4" type="radio"><label class="tab-label" for="tab-set--4-input--3">Windows</label><div class="tab-content docutils"> <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:></span> py -m pip install --upgrade package_coffee package_tea </pre></div> </div> </div> </div> </p> </section> <section id="utilize-constraint-files"> <h3>Utilize Constraint Files<a class="headerlink" href="#utilize-constraint-files" title="Link to this heading">¶</a></h3> <p>If you need to impose additional version restrictions on transitive dependencies (dependencies of dependencies), consider using a constraint file. A constraint file specifies version limits for packages that are indirectly required. For example:</p> <div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="c1"># constraints.txt</span> <span class="n">indirect_dependency</span><span class="o">>=</span><span class="mf">2.0.0</span> </pre></div> </div> <p>Then install your packages with:</p> <p><div class="tab-set docutils"> <input checked="True" class="tab-input" id="tab-set--5-input--1" name="tab-set--5" type="radio"><label class="tab-label" for="tab-set--5-input--1">Linux</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>--constraint<span class="w"> </span>constraints.txt<span class="w"> </span>package_coffee<span class="w"> </span>package_tea </pre></div> </div> </div> <input class="tab-input" id="tab-set--5-input--2" name="tab-set--5" type="radio"><label class="tab-label" for="tab-set--5-input--2">MacOS</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span>--constraint<span class="w"> </span>constraints.txt<span class="w"> </span>package_coffee<span class="w"> </span>package_tea </pre></div> </div> </div> <input class="tab-input" id="tab-set--5-input--3" name="tab-set--5" type="radio"><label class="tab-label" for="tab-set--5-input--3">Windows</label><div class="tab-content docutils"> <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:></span> py -m pip install --constraint constraints.txt package_coffee package_tea </pre></div> </div> </div> </div> </p> </section> <section id="use-upper-bounds-sparingly"> <h3>Use Upper Bounds Sparingly<a class="headerlink" href="#use-upper-bounds-sparingly" title="Link to this heading">¶</a></h3> <p>Although upper bounds are generally discouraged because they can complicate dependency management, they may be necessary when certain versions are known to cause conflicts. Use them cautiously—for example:</p> <p><div class="tab-set docutils"> <input checked="True" class="tab-input" id="tab-set--6-input--1" name="tab-set--6" type="radio"><label class="tab-label" for="tab-set--6-input--1">Linux</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">"package_coffee>=0.44.0,<1.0.0"</span><span class="w"> </span><span class="s2">"package_tea>=4.0.0"</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--6-input--2" name="tab-set--6" type="radio"><label class="tab-label" for="tab-set--6-input--2">MacOS</label><div class="tab-content docutils"> <div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>python<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">"package_coffee>=0.44.0,<1.0.0"</span><span class="w"> </span><span class="s2">"package_tea>=4.0.0"</span> </pre></div> </div> </div> <input class="tab-input" id="tab-set--6-input--3" name="tab-set--6" type="radio"><label class="tab-label" for="tab-set--6-input--3">Windows</label><div class="tab-content docutils"> <div class="highlight-doscon notranslate"><div class="highlight"><pre><span></span><span class="gp">C:></span> py -m pip install <span class="s2">"package_coffee>=0.44.0,<1.0.0"</span> <span class="s2">"package_tea>=4.0.0"</span> </pre></div> </div> </div> </div> </p> </section> <section id="report-resolutiontoodeep-errors"> <h3>Report ResolutionTooDeep Errors<a class="headerlink" href="#report-resolutiontoodeep-errors" title="Link to this heading">¶</a></h3> <p>If you encounter a <code class="docutils literal notranslate"><span class="pre">ResolutionTooDeep</span></code> error consider reporting it, to help the pip team have real world examples to test against, at the dedicated <a class="reference external" href="https://github.com/pypa/pip/issues/13281">pip issue</a>.</p> </section> </section> <section id="getting-help"> <h2>Getting help<a class="headerlink" href="#getting-help" title="Link to this heading">¶</a></h2> <p>If none of the suggestions above work for you, we recommend that you ask for help on:</p> <ul class="simple"> <li><p><a class="reference external" href="https://discuss.python.org/c/users/7">Python user Discourse</a></p></li> <li><p><a class="reference external" href="https://www.python.org/community/forums/">Python user forums</a></p></li> <li><p><a class="reference external" href="https://pythondev.slack.com/">Python developers Slack channel</a></p></li> <li><p><a class="reference external" href="https://www.python.org/community/irc/">Python IRC</a></p></li> <li><p><a class="reference external" href="https://stackoverflow.com/questions/tagged/python">Stack Overflow</a></p></li> </ul> <p>See <a class="reference external" href="https://stackoverflow.com/help/how-to-ask">“How do I ask a good question?”</a> for tips on asking for help.</p> <p>Unfortunately, <strong>the pip team cannot provide support for individual dependency conflict errors</strong>. Please <em>only</em> open a ticket on <a class="reference external" href="https://github.com/pypa/pip/issues">pip’s issue tracker</a> if you believe that your problem has exposed a bug in pip.</p> </section> </section> </article> </div> <footer> <div class="related-pages"> <a class="next-page" href="more-dependency-resolution.html"> <div class="page-info"> <div class="context"> <span>Next</span> </div> <div class="title">More on Dependency Resolution</div> </div> <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg> </a> <a class="prev-page" href="configuration.html"> <svg class="furo-related-icon"><use href="#svg-arrow-right"></use></svg> <div class="page-info"> <div class="context"> <span>Previous</span> </div> <div class="title">Configuration</div> </div> </a> </div> <div class="bottom-of-page"> <div class="left-details"> <div class="copyright"> <a href="../copyright.html">Copyright</a> © The pip developers </div> Made with <a href="https://www.sphinx-doc.org/">Sphinx</a> and <a class="muted-link" href="https://pradyunsg.me">@pradyunsg</a>'s <a href="https://github.com/pradyunsg/furo">Furo</a> </div> <div class="right-details"> </div> </div> </footer> </div> <aside class="toc-drawer"> <div class="toc-sticky toc-scroll"> <div class="toc-title-container"> <span class="toc-title"> On this page </span> </div> <div class="toc-tree-container"> <div class="toc-tree"> <ul> <li><a class="reference internal" href="#">Dependency Resolution</a><ul> <li><a class="reference internal" href="#how-it-works">How it works</a></li> <li><a class="reference internal" href="#backtracking">Backtracking</a></li> <li><a class="reference internal" href="#possible-ways-to-reduce-backtracking">Possible ways to reduce backtracking</a><ul> <li><a class="reference internal" href="#allow-pip-to-complete-its-backtracking">Allow pip to complete its backtracking</a></li> <li><a class="reference internal" href="#reduce-the-number-of-versions-pip-is-trying-to-use">Reduce the number of versions pip is trying to use</a></li> <li><a class="reference internal" href="#use-constraint-files-or-lockfiles">Use constraint files or lockfiles</a></li> </ul> </li> <li><a class="reference internal" href="#dealing-with-dependency-conflicts">Dealing with dependency conflicts</a><ul> <li><a class="reference internal" href="#understanding-your-error-message">Understanding your error message</a></li> <li><a class="reference internal" href="#possible-solutions">Possible solutions</a><ul> <li><a class="reference internal" href="#audit-your-top-level-requirements">Audit your top level requirements</a></li> <li><a class="reference internal" href="#loosen-your-top-level-requirements">Loosen your top level requirements</a></li> <li><a class="reference internal" href="#loosen-the-requirements-of-your-dependencies">Loosen the requirements of your dependencies</a></li> <li><a class="reference internal" href="#all-requirements-are-appropriate-but-a-solution-does-not-exist">All requirements are appropriate, but a solution does not exist</a></li> </ul> </li> </ul> </li> <li><a class="reference internal" href="#handling-resolution-too-deep-errors">Handling Resolution Too Deep Errors</a><ul> <li><a class="reference internal" href="#specify-reasonable-lower-bounds">Specify Reasonable Lower Bounds</a></li> <li><a class="reference internal" href="#use-the-upgrade-flag">Use the <code class="docutils literal notranslate"><span class="pre">--upgrade</span></code> Flag</a></li> <li><a class="reference internal" href="#utilize-constraint-files">Utilize Constraint Files</a></li> <li><a class="reference internal" href="#use-upper-bounds-sparingly">Use Upper Bounds Sparingly</a></li> <li><a class="reference internal" href="#report-resolutiontoodeep-errors">Report ResolutionTooDeep Errors</a></li> </ul> </li> <li><a class="reference internal" href="#getting-help">Getting help</a></li> </ul> </li> </ul> </div> </div> </div> </aside> </div> </div><script src="../_static/documentation_options.js?v=22103397"></script> <script src="../_static/doctools.js?v=9bcbadda"></script> <script src="../_static/sphinx_highlight.js?v=dc90522c"></script> <script type="module" src="../_static/scripts/furo.js?v=d32f1409"></script> <script src="../_static/clipboard.min.js?v=66b4909c"></script> <script src="../_static/copybutton.js?v=80126f2a"></script> <script src="../_static/tabs.js?v=3ee01567"></script> </body> </html>