Skip to content

Python environments with uv

Overview

uv is a Python package installer and resolver that is a drop-in replacement for pip. This page provides step-by-step instructions for using uv on a Linux system without requiring sudo privileges. For more detailed documentation, see here.

This page also includes a section on running uv with Slurm for job scheduling on clusters, both CPU-only and GPU jobs. The instructions below assume you are installing uv as a standalone tool in your user space.

Installing for your user

On Linux or macOS, install uv in your user environment with the following command:

curl -LsSf https://astral.sh/uv/install.sh | sh

For other installation methods, for example on Windows or when using Homebrew on macOS, see here.

After installation, restart your shell to update your PATH:

exec $SHELL

You can check that uv is available by running

uv --help

Updating

If you already have uv installed and would like to update to a newer version

uv self update

Using virtual environments

uv supports efficient project management through virtual environments and dependency locking. Full documentation is here

Creating a new environment

Initialize a new isolated Python virtual environment. You can specify any name for your virtual environment directory. By default, it's .venv/.

uv venv
source .venv/bin/activate

To specify a Python version

uv venv --python 3.13
source .venv/bin/activate

To specify a non-default name

uv venv my-venv
source my-venv/bin/activate

Installing dependency packages

After running source .venv/bin/activate, install individual packages from PyPi

uv pip install pandas

To install from a requirements.txt file

uv pip install -r requirements.txt

Exporting an environment

Option 1: requirements.txt

Freeze your current dependencies into a requirements.txt file

uv pip freeze > requirements.txt

Option 2: requirements.lock

Another possibility is to use the native uv syntax to create a cross-platform lock file

uv pip compile pyproject.toml -o requirements.lock

Then later, reinstall from the lock file with

uv pip sync requirements.lock

Option 3: pyproject.toml

Alternatively, if you're using uv's project management (which requires a pyproject.toml file), you can use:

uv lock

to generate a uv.lock file, and then

uv sync

to recreate the environment.

Deactivating an environment

deactivate

Installing Python

Optionally, you may use uv to install a specific Python version directly into your user space, without creating a virtual environment. This can be useful if you frequently use multiple Python versions.

uv python install 3.13

Verify your installation

uv python find --system

And run Python, either from the shell

uv run --python python3.13 -- python

Or by running a script

uv run --python python3.13 my-code.py

Running jobs with Slurm

To run Python scripts using uv on a Slurm cluster, you can start with the following CPU-only or GPU examples of sbatch scripts.

Example CPU job

In this example, there are no Python dependency packages. If there were, you can follow steps above to create a virtual environment and then add source my-venv/bin/activate to the sbatch script before the uv run command.

Here's a sample python code, which you can save as cpu-code.py

#!/usr/bin/env python3

"""
Example CPU-bound script.
This script simulates a CPU-intensive task by calculating
large Fibonacci numbers.
"""

def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

if __name__ == "__main__":
    result = fibonacci(30)
    print(f"Result: {result}")

Save this submission script as cpu-job.sh

#!/bin/bash -l
#SBATCH --job-name=cpu-job
#SBATCH --cpus-per-task=8
#SBATCH --mem=8G
#SBATCH --time=00:10:00
#SBATCH --output=cpu-%j.log

###source my-venv/bin/activate
uv run --python python3.13 cpu-code.py

Submit the job

sbatch cpu-job.sh

To see the output file

cat cpu-*.log

Example GPU job

First, set up a pytorch environment on a GPU-compute node.

On the ScienceCluster, you can request an interactive GPU-compute node:

# interactive session to work on a GPU-compute node
srun --pty -n 1 -c 4 --time=00:10:00 --mem=16GB --gpus=1 bash -l

# create a virtual environment
uv venv venv-torch-gpu
source venv-torch-gpu/bin/activate

# install required Python packages
uv pip install torch numpy

After installation, leave the interactive GPU session by first deactivating the environment and then exiting the shell by running deactivate and then exit.

After exiting the interactive session, save the following Python code to a file called gpu-code.py.

#!/usr/bin/env python3

"""
This script checks for GPU availability, then runs a small
tensor operation with PyTorch on the GPU (if available).
"""

import torch

if __name__ == "__main__":
    device = "cuda" if torch.cuda.is_available() else "cpu"
    print(f"Running on device: {device}")

    size = 1000
    a = torch.rand((size, size), device=device)
    b = torch.rand((size, size), device=device)
    c = a @ b  # matrix multiplication

    print("Matrix multiplication successful.")

Specify GPU resources explicitly in your sbatch script

#!/bin/bash -l
#SBATCH --job-name=gpu-job
#SBATCH --cpus-per-task=2
#SBATCH --mem=8G
#SBATCH --gres=gpu:1
#SBATCH --time=00:10:00
#SBATCH --output=gpu-%j.log

source venv-torch-gpu/bin/activate
uv run gpu-code.py

Submit the GPU job

sbatch gpu-job.sh

To see the output file

cat gpu-*.log