Step 1: Understanding the Error
You activate your Python virtual environment, run pip install
, and suddenly get hit with dependency conflicts. The terminal floods with red text about incompatible package versions, and your project won't run.
$ source venv/bin/activate
$ pip install django==4.2 celery==5.3.0
ERROR: Cannot install django==4.2 and celery==5.3.0 because these package versions have conflicting dependencies.
ERROR: ResolutionImpossible: for help visit https://pip.pypa.io/en/latest/topics/dependency-resolution
This happens when packages in your virtual environment require different versions of the same dependency. Django 4.2 might need kombu>=5.3,<6.0
while Celery 5.3.0 requires kombu>=5.2,<5.3
. Python can't install both versions simultaneously, causing pip to fail.
Virtual environments should isolate your project dependencies, but conflicts still occur when packages have overlapping requirements that don't align. Let's fix these issues systematically.
Step 2: Identifying the Cause
Check Your Current Environment State
First, verify which packages are already installed and identify the conflict source.
$ pip list
Package Version
---------- -------
Django 4.1.0
celery 5.2.0
kombu 5.2.4
Now inspect the specific dependency requirements causing the conflict.
$ pip show django | grep Requires
$ pip show celery | grep Requires
Requires: asgiref, sqlparse, kombu>=5.3
Requires: billiard, click, kombu<5.3,>=5.2
The conflict is clear: Django wants kombu>=5.3
while Celery needs kombu<5.3
. These requirements are mutually exclusive.
Reproduce the Conflict Intentionally
Create a minimal test case to understand the problem better.
$ python3 -m venv test_env
$ source test_env/bin/activate
$ pip install django==4.2.0 celery==5.2.7
ERROR: pip's dependency resolver does not currently take into account all the packages that are installed.
ERROR: After December 2020 you may report this if you run into it again.
This error message appears when pip detects impossible dependency combinations before installation even begins.
Step 3: Implementing the Solution
Solution 1: Check Compatible Versions
The most reliable fix is finding package versions that share compatible dependencies.
$ pip install django==4.2.0 --dry-run
This command shows what would be installed without actually installing it. Check the dependency tree first.
$ pip install pipdeptree
$ pipdeptree -p django
django==4.2.0
- asgiref [required: >=3.6.0,<4, installed: 3.7.2]
- sqlparse [required: >=0.3.1, installed: 0.4.4]
- kombu [required: >=5.3.0, installed: None]
Now check Celery's requirements the same way.
$ pipdeptree -p celery
Update to compatible versions that satisfy both packages.
$ pip uninstall django celery kombu -y
$ pip install django==4.1.0 celery==5.2.7
Django 4.1 and Celery 5.2.7 both work with kombu 5.2.x, resolving the conflict.
Solution 2: Use Requirements Files with Version Ranges
Instead of pinning exact versions, use flexible version ranges that allow pip to resolve dependencies automatically.
Create a requirements.in
file:
django>=4.0,<4.2
celery>=5.2,<5.4
redis>=4.5
This approach gives pip room to find compatible versions. Install pip-tools for better dependency management.
$ pip install pip-tools
$ pip-compile requirements.in
#
# This file is autogenerated by pip-compile with Python 3.11
#
django==4.1.13
# via -r requirements.in
celery==5.3.4
# via -r requirements.in
kombu==5.3.4
# via celery
redis==5.0.1
# via -r requirements.in
The compiled requirements.txt
shows exact versions that work together. Install them cleanly.
$ pip install -r requirements.txt
Solution 3: Create a Fresh Virtual Environment
Sometimes environments become corrupted or have conflicting cached packages. Start fresh.
$ deactivate
$ rm -rf venv
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install --upgrade pip
Upgrade pip first because older versions have less sophisticated dependency resolution. Pip 20.3+ includes a new resolver that handles conflicts better.
$ pip install django==4.2.0 celery==5.3.1
If this still fails, the packages truly are incompatible. Check their release notes or GitHub issues for known conflicts.
Solution 4: Use Constraint Files
Constraint files limit what pip can install without explicitly requiring packages.
Create constraints.txt
:
kombu==5.3.2
billiard==4.1.0
click==8.1.7
Install packages while respecting these constraints.
$ pip install -c constraints.txt django celery
This forces pip to use specific versions of shared dependencies, preventing conflicts before they occur.
Working Code Example
Here's a complete workflow for setting up a conflict-free environment for a Django + Celery project.
$ mkdir django_celery_project
$ cd django_celery_project
$ python3 -m venv venv
$ source venv/bin/activate
Create requirements.in
:
django>=4.1,<4.3
celery[redis]>=5.2,<5.4
django-celery-beat>=2.5
python-dotenv>=1.0
Compile and install:
$ pip install pip-tools
$ pip-compile requirements.in --output-file requirements.txt
$ pip install -r requirements.txt
Verify no conflicts exist:
$ pip check
No broken requirements found.
The pip check
command verifies all installed packages have compatible dependencies. If you see any warnings here, address them before starting development.
Additional Tips & Related Errors
Error: "Cannot uninstall package, it is a distutils installed project"
This occurs when packages were installed outside the virtual environment or with system pip.
$ pip install --ignore-installed django
The --ignore-installed
flag reinstalls the package in your virtual environment, bypassing the system installation.
Error: "Requirement already satisfied" but import fails
Your virtual environment might not be activated, or you have multiple Python installations.
$ which python
/usr/bin/python3
If this shows a system path instead of venv/bin/python
, reactivate your environment.
$ deactivate
$ source venv/bin/activate
$ which python
/path/to/your/project/venv/bin/python
Handling Multiple Python Versions
Specify the exact Python version when creating environments to avoid conflicts between Python 3.9, 3.10, 3.11, etc.
$ python3.11 -m venv venv311
$ source venv311/bin/activate
$ python --version
Python 3.11.7
Some packages only work with specific Python versions. Always check package documentation for version compatibility before installation.
Debugging with Pip's Verbose Output
When conflicts are unclear, use verbose mode to see exactly what pip is attempting.
$ pip install django==4.2 celery==5.3 -vvv
This outputs detailed information about dependency resolution, showing where conflicts occur in the dependency tree. Look for lines containing "conflicts with" or "incompatible with" to identify the problematic packages.
Using Poetry or Conda for Complex Projects
If pip consistently fails to resolve dependencies, consider alternative package managers.
Poetry example:
$ pip install poetry
$ poetry init
$ poetry add django@^4.2 celery@^5.3
Poetry uses a more sophisticated dependency resolver and creates lock files automatically. It handles complex dependency chains better than pip in many cases.
Conda example:
$ conda create -n myproject python=3.11
$ conda activate myproject
$ conda install django celery -c conda-forge
Conda resolves dependencies across multiple languages and often provides pre-compiled binaries, avoiding compilation errors that sometimes cause conflicts.
Checking Upstream Issues
Before spending hours debugging, search the package's GitHub issues for known conflicts.
$ pip show django | grep Home-page
Visit the homepage or GitHub repository and search issues for your specific package combination. Many conflicts are documented with recommended version combinations.
Creating Reproducible Environments
Always pin your working dependencies for production deployments.
$ pip freeze > requirements-lock.txt
This captures exact versions that work together. Use this file for deployment.
$ pip install -r requirements-lock.txt
Never use pip freeze
output directly for development requirements because it includes all transitive dependencies, making updates difficult.
Dealing with Pre-release Versions
Sometimes conflicts exist because you need a pre-release version that hasn't been officially published.
$ pip install --pre celery
The --pre
flag allows installation of alpha, beta, or release candidate versions. These may have fixed compatibility issues not yet available in stable releases.
Platform-Specific Conflicts
Mac, Linux, and Windows sometimes have different package versions available. Check your platform.
$ python -c "import platform; print(platform.system(), platform.machine())"
Darwin arm64
Some packages have compiled components that vary by platform. If team members use different operating systems, test your requirements file on all platforms before committing.
Cache Clearing for Persistent Issues
Pip caches downloaded packages. Clear the cache if you suspect corrupted downloads.
$ pip cache purge
$ pip install --no-cache-dir django celery
The --no-cache-dir
flag forces fresh downloads, ensuring you get clean package files.