Skip to main content
Dark‐mode image

PyPI version Downloads Build Status Documentation Status License

Python-BPF is an LLVM IR generator for eBPF programs written in Python. It uses llvmlite to generate LLVM IR and then compiles to LLVM object files. These object files can be loaded into the kernel for execution. Python-BPF performs compilation without relying on BCC.

Note: This project is under active development and not ready for production use.


Overview

  • Generate eBPF programs directly from Python.
  • Compile to LLVM object files for kernel execution.
  • Built with llvmlite for IR generation.
  • Supports maps, helpers, and global definitions for BPF.
  • Companion project: pylibbpf, which provides the bindings required for object loading and execution.

Installation

Dependencies:

  • bpftool
  • clang
  • Python ≥ 3.10

Install via pip:

pip install pythonbpf pylibbpf

Try It Out!

First, generate the vmlinux.py file for your kernel:

  • Install the required dependencies:
  • On Ubuntu:
sudo apt-get install bpftool clang
pip install pythonbpf pylibbpf ctypeslib2
  • Generate the vmlinux.py using:
sudo tools/vmlinux-gen.py
  • Copy this file to BCC-Examples/

Next, install requirements for BCC-Examples:

  • These requirements are only required for the python notebooks, vfsreadlat and container-monitor examples.
pip install -r BCC-Examples/requirements.txt

To spin up jupyter notebook examples:

  • Run and follow the instructions on screen
curl -s https://raw.githubusercontent.com/pythonbpf/Python-BPF/refs/heads/master/tools/setup.sh | sudo bash
  • Check the jupyter server on the web browser and run the notebooks in the BCC-Examples/ folder.

Example Usage

import time
from pythonbpf import bpf, map, section, bpfglobal, BPF
from pythonbpf.helper import pid
from pythonbpf.maps import HashMap
from pylibbpf import *
from ctypes import c_void_p, c_int64, c_uint64, c_int32
import matplotlib.pyplot as plt


# This program attaches an eBPF tracepoint to sys_enter_clone,
# counts per-PID clone syscalls, stores them in a hash map,
# and then plots the distribution as a histogram using matplotlib.
# It provides a quick view of process creation activity over 10 seconds.

@bpf
@map
def hist() -> HashMap:
    return HashMap(key=c_int32, value=c_uint64, max_entries=4096)


@bpf
@section("tracepoint/syscalls/sys_enter_clone")
def hello(ctx: c_void_p) -> c_int64:
    process_id = pid()
    prev = hist.lookup(process_id)
    if prev:
        previous_value = prev + 1
        print(f"count: {previous_value} with {process_id}")
        hist.update(process_id, previous_value)
        return 0
    else:
        hist.update(process_id, 1)
    return 0


@bpf
@bpfglobal
def LICENSE() -> str:
    return "GPL"


b = BPF()
b.load_and_attach()
hist = BpfMap(b, hist)
print("Recording")
time.sleep(10)

counts = list(hist.values())

plt.hist(counts, bins=20)
plt.xlabel("Clone calls per PID")
plt.ylabel("Frequency")
plt.title("Syscall clone counts")
plt.show()

Architecture

Python-BPF provides a complete pipeline to write, compile, and load eBPF programs in Python:

  1. Python Source Code

    • Users write BPF programs in Python using decorators like @bpf, @map, @section, and @bpfglobal.
    • Maps (hash maps), helpers (e.g., ktime, deref), and tracepoints are defined using Python constructs, preserving a syntax close to standard Python.
  2. AST Generation

    • The Python ast module parses the source code into an Abstract Syntax Tree (AST).
    • Decorators and type annotations are captured to determine BPF maps, tracepoints, and global variables.
  3. LLVM IR Emission

    • The AST is transformed into LLVM Intermediate Representation (IR) using llvmlite.
    • IR captures BPF maps, control flow, assignments, and calls to helper functions.
    • Debug information is emitted for easier inspection.
  4. LLVM Object File Compilation

    • The LLVM IR (.ll) is compiled into a BPF target object file (.o) using llc -march=bpf -O2.
    • This produces a kernel-loadable ELF object file containing the BPF bytecode.
  5. libbpf Integration (via pylibbpf)

    • The compiled object file can be loaded into the kernel using pylibbpf.
    • Maps, tracepoints, and program sections are initialized, and helper functions are resolved.
    • Programs are attached to kernel hooks (e.g., syscalls) for execution.
  6. Execution in Kernel

    • The kernel executes the loaded eBPF program.
    • Hash maps, helpers, and global variables behave as defined in the Python source.
    • Output can be read via BPF maps, helper functions, or trace printing.

This architecture eliminates the need for embedding C code in Python, allowing full Python tooling support while generating true BPF object files ready for kernel execution.


Development

  1. Create a virtual environment and activate it:

    python3 -m venv .venv
    source .venv/bin/activate
    
  2. Install dependencies:

    make install
    

    Then, run any example in examples

  3. Verify an object file with the kernel verifier:

    ./tools/check.sh check execve2.o
    
  4. Run an object file using bpftool:

    ./tools/check.sh run execve2.o
    
  5. Explore LLVM IR output from clang in examples/c-form by running make.


Resources and Talks


Authors


Release files for pythonbpf 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pythonbpf 0.2.0
File Size Uploaded
pythonbpf-0.2.0.tar.gz 103.9 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pythonbpf 0.2.0
File Interpreter ABI Platform
pythonbpf-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 217.5 kB

Release files / pythonbpf-0.2.0.tar.gz

Download URL pythonbpf-0.2.0.tar.gz
Size 103.9 kB
Tags Source
SHA-256 checksum
How to use checksums
1b9f71160e120928fb5d04e1cef2e98dec26551382a945d5502269572318e052
BLAKE2b-256 checksum
How to use checksums
ce65a85f723b0a1332894eadf285a9131dc88e033acd09af47b95335ad1937cc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release files / pythonbpf-0.2.0-py3-none-any.whl

Download URL pythonbpf-0.2.0-py3-none-any.whl
Size 113.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8081f3c30924451696267dc5e2419543df771e4ee642f3cf73d542816d1972e2
BLAKE2b-256 checksum
How to use checksums
3fed781d8a2319053baba3857372a374c08f60d4a6b902251f62a4b9460fe430
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

0.1.9

2 release files

0.1.8

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.3

2 release files

0.1.2

2 release files

0.1.1

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page