uv as a system-wide Python environment manager
Creating new virtual environments for each project during quick prototyping, data analysis, or machine learning can be cumbersome. While managing a global environment with pip is simpler, it often leads to dependency conflicts and version mismatches, especially as the number of installed packages grows.
Tools like poetry excel at managing project dependencies, but they can also effectively manage global environments.
uv is a modern Python environment manager written in Rust. Here’s a brief overview of using uv to manage a global environment. Note that this approach works with poetry as well.
1 Installing uv
uv is available via multiple sources, just a few examples:
macOS (and Linuxbrew)
brew install uvFedora (41+)
sudo dnf install uvpipx
pipx install uvWhen installed, uv provides a set of commands to manage Python environments, packages, and dependencies.
2 Creating a virtual environment
Global virtual environments should be stored in the home directory:
cd ~Create a virtual environment with Python 3.12 (or other version):
uv init --python 3.12 --no-package --vcs none --no-readme --no-workspaceThis initializes a project named after your home directory (you can modify it later). uv generates two files and a directory:
A sample Python script:
hello.py
def main(): print("Hello from sheg!") if __name__ == "__main__": main()You can delete it:
rm hello.pyA configuration file where
uvstores general information and will store all explicitly required packages:pyproject.toml
[project] name = "sheg" version = "0.1.0" description = "Add your description here" requires-python = ">=3.12" dependencies = []- 1
- The project name defaults to your home directory. You can change it to any name you prefer.
- 2
- As of this writing, tis is required and can’t be deleted, but the version number is arbitrary.
- 3
- Optional.
- 4
- The minimum Python version.
- 5
- Where all required packages will be listed.
A
.venvdirectory containing the virtual environment.
3 Installing packages
To install packages, use the uv add command followed by the package name (multiple packages can be added at once):
uv add scikit-learn seabornThis updates pyproject.toml as follows:
pyproject.toml
[project]
name = "sheg"
version = "0.1.0"
dependencies = [
"scikit-learn>=1.6.0",
"seaborn>=0.13.2",
]Additionally, uv generates a uv.lock file which stores the exact versions of the installed packages to ensure reproducibility, e.g. for later installations or on another machine.
4 Modifying package versions
pyproject.toml does not store the exact package versions, only some constraints (e.g., seaborn>=0.13.2). uv uses pyproject.toml to check with packages and their versions are required by the environment and then automatically resolves the exact versions and stores them in uv.lock.
You can modify the version constraints in pyproject.toml, e.g. to lower the minimum version of scikit-learn:
pyproject.toml (example)
[project]
name = "sheg"
version = "0.1.0"
dependencies = [
"scikit-learn>=1.4.0",
"seaborn>=0.13.2",
]- 1
-
This was changed from
1.6.0to1.4.0.
Then, to apply the changes (resolve the exact versions and install/remove packages) run:
uv syncThis updates the uv.lock file with the new specifications.
5 Hiding environment files (Optional)
To declutter your home directory, you can hide pyproject.toml and uv.lock files:
macOS:
chflags hidden pyproject.toml uv.lockWindows:
Right-click the file, select Properties, and check the Hidden box.
GNOME (Ubuntu, Fedora, etc.):
Create a .hidden file listing the files to hide:
nano .hiddenAdd:
.hidden
pyproject.toml
uv.lock
6 Running Python interpreter and commands
To execute commands within your environment, prefix them with uv run.
For example, to run a Python shell:
uv run pythonTo run a Python script:
uv run python script.pyTo run any command within the environment:
uv run echo "Hello, world!"Do this if the command requires Python interpreter or packages from the environment.
7 Using VS Code notebooks
To use VS Code for Jupyter notebooks install ipykernel:
uv add ipykernelRegister the kernel:
uv run python -m ipykernel install --userSelect your environment in VS Code:
8 Using Jupyter
To use Jupyter, you need to install it:
uv add jupyterThen, run it with uv:
uv run jupyter labThis opens the Jupyter Lab interface in your browser:
9 Checking the active environment
uv resolves the current environment based on your working directory. If you’re in a directory without .venv, pyproject.toml, or uv.lock (i.e., not in a uv project), it looks for an environment in the parent directories.
To explicitly check which environment uv will use, run:
uv python find/Users/sheg/.venv/bin/python3
