No module named 'distutils.util' ...but distutils is installed?
Categories:
Resolving 'No module named 'distutils.util'' in Python on Ubuntu

Encountering 'No module named 'distutils.util'' despite distutils being installed can be frustrating. This article explains common causes and provides solutions for Python environments on Ubuntu.
The distutils
module is a standard part of Python's ecosystem, primarily used for building and installing Python packages. However, users, especially on Ubuntu systems, sometimes face a ModuleNotFoundError: No module named 'distutils.util'
even when they believe distutils
is present. This issue often arises due to changes in Python's packaging landscape, virtual environment configurations, or system-level Python installations. Understanding the root cause is key to a lasting solution.
Understanding the 'distutils' Module's Role and Evolution
Historically, distutils
was the go-to module for package management in Python. It provided the necessary tools to define and build distribution packages. Over time, more robust and feature-rich alternatives like setuptools
emerged, which often extend or replace functionalities originally provided by distutils
. In newer Python versions (specifically Python 3.10 and later), distutils
has been deprecated and eventually removed from the standard library. This means that if you're using a modern Python version, distutils
might not be available by default, or it might be provided by setuptools
as a compatibility layer.
flowchart TD A[Python Project] --> B{Build/Install Process} B --> C{Requires 'distutils'} C --> D{Python Version < 3.10?} D -- Yes --> E[distutils in Standard Library] D -- No --> F{setuptools installed?} F -- Yes --> G[setuptools provides distutils compatibility] F -- No --> H[ModuleNotFoundError: No module named 'distutils.util']
Flowchart illustrating the dependency resolution for 'distutils.util'
Common Causes and Solutions on Ubuntu
The 'No module named 'distutils.util'' error on Ubuntu can stem from several scenarios. Identifying your specific situation is crucial for applying the correct fix. We'll cover the most frequent causes and their respective solutions.
Scenario 1: Missing setuptools
or pip
in Virtual Environment
When working with virtual environments, it's possible that setuptools
(which often provides the distutils
compatibility layer) or pip
itself might be outdated or missing. This is particularly common if the virtual environment was created with an older venv
or virtualenv
version, or if pip
was not properly bootstrapped.
1. Activate Virtual Environment
Ensure your virtual environment is active. Replace myenv
with the name of your virtual environment.
2. Upgrade pip and setuptools
Inside your active virtual environment, upgrade pip
and setuptools
to their latest versions. This often resolves the issue by pulling in the necessary distutils
compatibility.
source myenv/bin/activate
pip install --upgrade pip setuptools
Upgrading pip and setuptools within a virtual environment
Scenario 2: System-wide Python Installation Issues (Ubuntu)
On Ubuntu, system Python installations are managed carefully to avoid breaking system tools that rely on specific Python versions and packages. Directly modifying system Python packages can lead to instability. If you're not using a virtual environment, or if the issue persists even after upgrading setuptools
in a virtual environment, it might be related to how distutils
is handled by your system's Python installation.
sudo pip install
for system-wide installations unless absolutely necessary and you understand the implications. This can corrupt your system's Python environment.1. Install python3-distutils
(if applicable)
For older Ubuntu versions or specific Python setups, the distutils
module might be provided by a separate system package. This is less common for modern Python 3 installations but can be a solution for some edge cases.
2. Reinstall Python Development Headers
Sometimes, missing development headers can cause issues with Python package installations. Reinstalling them can resolve underlying problems.
sudo apt update
sudo apt install python3-distutils # Or python-distutils for Python 2
sudo apt install python3-dev # Or python-dev for Python 2
Installing system-level distutils and Python development headers on Ubuntu
Scenario 3: Python Version Incompatibility
As mentioned, distutils
was removed from the standard library in Python 3.10 and later. If your project or a dependency explicitly tries to import distutils.util
directly in a Python 3.10+ environment without setuptools
providing the compatibility layer, you will encounter this error. The best long-term solution is to update the problematic package or code to use modern packaging tools.

Python version compatibility and the role of setuptools for distutils
1. Check Python Version
Determine the Python version being used by your project or environment.
2. Update Project Dependencies
If you are using Python 3.10+, ensure all your project's dependencies are up-to-date. Many packages have released versions compatible with newer Python versions that no longer rely on the deprecated distutils
directly.
3. Consider Downgrading (Temporary)
As a temporary workaround, if updating dependencies is not immediately feasible, you might consider using a Python version older than 3.10 (e.g., 3.9) for that specific project. This should be a last resort and a plan should be made to upgrade.
python3 --version
pip install --upgrade <problematic_package>
Checking Python version and upgrading a specific package