Use python -m venv for project packages, and use pipx for Python command-line apps. That is the simple rule. If your Linux system says “externally managed environment”, do not fight it with random sudo pip install commands. That way lies broken tools, weird errors, and a tiny headache wearing a wizard hat.
TLDR: The “externally managed environment” warning means your operating system wants to protect its Python install. For a web app or script project, create a virtual environment with python -m venv .venv. For a standalone tool like black, ruff, or httpie, install it with pipx install ruff. In a small team with 10 Python projects and 15 CLI tools, using venv plus pipx can cut package conflicts from “weekly pain” to almost zero.
What does “externally managed environment” mean?
You may see an error like this:
error: externally-managed-environment
This often happens on newer Debian, Ubuntu, Fedora, and similar systems. It comes from PEP 668. The idea is simple. Your system Python is owned by your package manager. That may be apt, dnf, pacman, or another tool.
So when you run:
pip install requests
your system may say: “Nope.”
Annoying? Yes. Sensible? Also yes.
Your operating system may depend on Python packages. If pip changes them, system tools can break. Honestly, it feels like being stopped by a mall cop while buying socks. But the mall cop is right this time.
The wrong fix: forcing pip
You may find advice like this:
pip install --break-system-packages somepackage
That flag does what it says. It may break system packages. Great name. Terrible life choice.
There are rare cases where it is fine. Most people should avoid it. It is like removing the batteries from a smoke alarm because it beeped once.
Use venv for project work
A virtual environment, or venv, is a private Python room for one project. Packages installed there stay there. They do not spill into your system Python. They do not bother other projects.
Use it like this:
python3 -m venv .venvsource .venv/bin/activateon Linux or macOS.venv\Scripts\activateon Windowspip install requests flask pytest
Now your project has its own space. One project can use Django 4. Another can use Django 5. They can glare at each other from different folders.
When you are done, run:
deactivate
Nothing dramatic happens. You just leave the room.
When venv is the best choice
Use venv when you are building something. For example:
- A web app
- A data script
- A machine learning project
- A command line tool you are writing
- A test suite
- A small automation script with dependencies
Each project should have its own .venv. This keeps things clean. It also makes bugs easier to find. Nobody wants to ask, “Is this broken because of my code, or because I installed six versions of NumPy last Tuesday?”
Use pipx for Python apps
pipx is for installing Python-based command-line tools. It gives each tool its own hidden virtual environment. Then it exposes the command globally.
That sounds fancy. It is not. It means you can type:
pipx install black
Then run:
black myfile.py
black is isolated. It does not pollute your system Python. It does not sit inside one project. It is just available as a tool.
This is perfect for apps like:
blackruffpoetryhttpiecookiecutteryt-dlp
It drives me crazy that installing one small tool with plain pip can drag in 30 packages into the wrong place. pipx avoids that mess.
venv vs pipx: the easy split
Here is the simple version.
- Use
venvwhen the packages belong to a project. - Use
pipxwhen the package is an app you run from the terminal. - Use system packages when you need OS-managed tools.
- Avoid global
pip installon managed systems.
A good test is this question:
“Am I importing this in code, or running it as a command?”
If you import it, use venv. If you run it, use pipx.
Example:
import requestsin your app? Usevenv.- Run
ruff check .in the terminal? Usepipx.
What about pip itself?
pip is not bad. It is still the core installer for Python packages. The issue is where you use it.
Inside a virtual environment, pip is great:
python -m pip install flask
On your system Python, it can be risky. That is why newer systems stop you. They are not being mean. They are trying to keep your laptop from turning into soup.
Package management alternatives
Python has many package tools. Some are helpful. Some feel like they were named during a caffeine emergency.
uv
uv is a newer tool written in Rust. It is very fast. It can create virtual environments, install packages, and manage projects. If you hate waiting, try it.
Example:
uv venv
uv pip install requests
It can feel like pip, but quicker. On some installs, it can save several seconds each time. That adds up when your build runs 50 times a day.
Poetry
Poetry manages dependencies and packaging. It uses a pyproject.toml file. It is popular for apps and libraries.
It can create virtual environments for you. That is nice. The tradeoff is extra commands and a bit more structure.
Conda
Conda is common in data science. It manages Python packages and non-Python libraries too. That is useful for tools that need heavy native code.
If you work with scientific packages, GPUs, or large data tools, Conda may save time.
OS package managers
Your system package manager still matters. Use it for system tools.
sudo apt install python3-venvsudo apt install pipxsudo dnf install python3-pipx
This keeps your base system tidy. Then Python tools can live in their own safe places.
A simple setup that works
Here is a clean setup for most people:
- Install Python from your OS or from python.org.
- Install
python3-venvif needed. - Install
pipx. - Use
venvinside every project. - Use
pipxfor global Python CLI apps. - Do not use
sudo pip install.
That last rule saves pain. Print it. Put it on a mug.
Quick cheat sheet
- Need Flask for a project? Use
venv. - Need
blackeverywhere? Usepipx. - Need system Python fixed? Use your OS package manager.
- Need data science packages? Consider Conda.
- Need speed? Try
uv.
The “externally managed environment” message is not the enemy. It is a guard rail. Let the system own system Python. Let projects own their own virtual environments. Let pipx handle command-line apps. Your future self will complain a lot less.