Skip to content

Why should I avoid using the system Python?

The “system Python” is the Python interpreter that ships with your operating system. On macOS and most Linux distributions, it lives at /usr/bin/python3. On Windows, it may come from the Microsoft Store or a manual system-wide installation.

This interpreter exists for the operating system, not for development work. Using it for your own projects causes three categories of problems.

It can break your OS

macOS and Linux rely on the system Python to run internal tools. Package managers, system utilities, and desktop components import modules from the system site-packages directory. Installing, upgrading, or removing packages in that directory can silently break those tools. On Ubuntu, for example, overwriting the system requests library can break apt itself.

Modern distributions have started fighting back. PEP 668 introduced the EXTERNALLY-MANAGED marker, which causes pip install to refuse to modify system site-packages by default. If you have ever seen the error externally-managed-environment, that marker is the reason.

It forces you into a single version

The system Python ships one version, and that version is chosen by the OS vendor for compatibility, not currency. macOS 15 ships Python 3.9; Ubuntu 24.04 ships Python 3.12. If a project needs a different version, the system interpreter cannot help.

Multiple projects on the same machine often need different Python versions. Without a way to switch interpreters, developers end up compiling Python from source or installing from third-party PPAs, both of which create maintenance headaches.

It lacks isolation

Every pip install into the system Python adds packages to a single, shared directory. Two projects that depend on different versions of the same library cannot coexist. The last install wins, and the other project breaks silently.

What to do instead

Use uv to manage both Python versions and virtual environments. A single command installs any Python version and creates an isolated environment for a project:

$ uv init my-project
$ cd my-project
$ uv add requests

uv downloads the right Python interpreter automatically, creates a virtual environment, and records dependencies in pyproject.toml. Each project gets its own environment, its own interpreter, and its own set of packages.

Tip

Even a manually installed Python (from python.org or Homebrew) shares the same isolation problem. Always use virtual environments regardless of how Python was installed.

Related

Get Python tooling updates

Subscribe to the newsletter
Last updated on

Please submit corrections and feedback...