Skip to main content

Clang Python Bindings, mirrored from the official LLVM repo: https://github.com/llvm/llvm-project/tree/main/clang/bindings/python.

Project description

libclang-ng

PyPI Python Downloads License Arch: x64 Arch: aarch64

Linux x64 Linux Arm64 MacOS x64 MacOS Arm64 Windows x64 Windows Arm64

libclang-ng packages the official Clang Python Bindings (clang.cindex) from the LLVM project and bundles a statically-linked libclang shared library for each supported platform. The result is a zero-configuration pip install that gives you a working Clang Python API without installing the LLVM toolchain.

Note: This package is named libclang-ng, and it's the natural evolution of libclang. The clang package on PyPI is a separate project and does not bundle a prebuilt shared library.

Installation

Install using pip:

pip install libclang-ng==20.1.8.1

Install using uv:

uv pip install libclang-ng==20.1.8.1

Best way to specify pinning is to allow for patch updates on the same clang version:

pip install "libclang-ng>=20.1.8.0,<21.0.0.0" --upgrade

Requirements

  • Python 3.12 or later

Platform Support

Platform Architecture Minimum OS
Linux x86_64 glibc 2.28+ (manylinux_2_28)
Linux aarch64 glibc 2.28+ (manylinux_2_28)
macOS x86_64 10.9+
macOS arm64 11.0+
Windows x86_64
Windows arm64

All native libraries are statically linked and libcxx headers are bundled in the python package - there are no external runtime dependencies beyond the standard system libraries (glibc on Linux, system frameworks on macOS, MSVC runtime on Windows).

Clang Versions

Supported clang versions:

Quick Start

Parse a file and walk the AST

from clang.cindex import Index, CursorKind

index = Index.create()
tu = index.parse("example.cpp", args=["-std=c++17"])

for cursor in tu.cursor.get_children():
    if cursor.kind == CursorKind.FUNCTION_DECL:
        print(f"Function: {cursor.spelling} at {cursor.location}")
        for param in cursor.get_arguments():
            print(f"  param: {param.spelling} ({param.type.spelling})")

Parse from a string (in-memory)

from clang.cindex import Index

index = Index.create()
tu = index.parse(
    "example.cpp",
    unsaved_files=[("example.cpp", "int add(int a, int b) { return a + b; }")],
    args=["-std=c++17"],
)

for cursor in tu.cursor.walk_preorder():
    print(f"{cursor.kind.name}: {cursor.spelling}")

Collect diagnostics

from clang.cindex import Index, Diagnostic

index = Index.create()
tu = index.parse("example.cpp")

for diag in tu.diagnostics:
    if diag.severity >= Diagnostic.Warning:
        print(f"{diag.severity}: {diag.spelling} [{diag.location}]")

Type introspection

from clang.cindex import Index, CursorKind, TypeKind

index = Index.create()
tu = index.parse("example.cpp")

for cursor in tu.cursor.walk_preorder():
    if cursor.kind == CursorKind.STRUCT_DECL:
        t = cursor.type
        print(f"struct {cursor.spelling}: size={t.get_size()} bytes")
        for field in t.get_fields():
            print(f"  {field.spelling}: {field.type.spelling} offset={t.get_offset(field.spelling)} bits")

Use a compilation database

from clang.cindex import Index, CompilationDatabase

db = CompilationDatabase.from_directory("/path/to/build")
cmds = db.get_compile_commands("src/main.cpp")

index = Index.create()
for cmd in cmds:
    tu = index.parse(cmd.filename, args=list(cmd.arguments)[1:])

API Overview

Class Purpose
Index Entry point — creates and owns translation units
TranslationUnit Represents a parsed source file; holds cursors and diagnostics
Cursor A node in the AST (declaration, expression, statement, …)
CursorKind Enumeration of all cursor node types
Type Type information attached to a cursor
TypeKind Enumeration of all type kinds
Diagnostic A compiler warning or error with location and fix-it hints
Token A lexical token (keyword, identifier, literal, …)
SourceLocation File/line/column position in source
SourceRange Start and end SourceLocation pair
CompilationDatabase Reads compile_commands.json for project-wide parsing

Full API documentation is generated from the module docstrings via Sphinx and is available at libclang-ng.readthedocs.io.

Configuration

By default the package locates libclang automatically from its bundled native/ directory. Override this when you want to use a system-installed or custom-built library:

Environment variable (before importing clang):

export LIBCLANG_LIBRARY_PATH=/usr/lib/llvm-19/lib
python your_script.py

Programmatic override (before any other clang import):

from clang.cindex import Config
Config.set_library_path("/usr/lib/llvm-19/lib")
# or point to a specific file:
# Config.set_library_file("/usr/lib/llvm-19/lib/libclang.so.19")

Development

The repository uses just as a task runner and uv as the Python package manager.

# Show the current LLVM version
just version

# Download LLVM source and update Python bindings
just download-llvm

# Full local build for macOS ARM64
just build-macos-arm64

CI / Release

Six GitHub Actions workflows build and publish a platform-specific wheel for each supported target. A release is triggered by pushing a version tag (v*), which causes each workflow to publish its wheel to PyPI.

License

This repository follows the license of the LLVM project: Apache-2.0 WITH LLVM-exception.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

libclang_ng-21.1.8.2-py3-none-win_arm64.whl (22.8 MB view details)

Uploaded Python 3Windows ARM64

libclang_ng-21.1.8.2-py3-none-win_amd64.whl (25.4 MB view details)

Uploaded Python 3Windows x86-64

libclang_ng-21.1.8.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (29.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

libclang_ng-21.1.8.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (28.8 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

libclang_ng-21.1.8.2-py3-none-macosx_11_0_arm64.whl (31.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

libclang_ng-21.1.8.2-py3-none-macosx_10_9_x86_64.whl (32.9 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

Details for the file libclang_ng-21.1.8.2-py3-none-win_arm64.whl.

File metadata

File hashes

Hashes for libclang_ng-21.1.8.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 8567e1e64e256d3dd9c9085089b0acd0000a7938223bedb46daf2eca08f3b13c
MD5 067db792a7dfd5bf91babd0cb85f0dd1
BLAKE2b-256 9d80802efce2eefbe660bb60369cf1f29d9169136e811e4795719968a0b56c1f

See more details on using hashes here.

File details

Details for the file libclang_ng-21.1.8.2-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for libclang_ng-21.1.8.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 bf3d024214b3ee75a30278798599e5abcebff3c98c44e772d76704fc00b8921f
MD5 bc5b7d90beeb8dbbafb277c596b567b8
BLAKE2b-256 fca413bc2d954f0848c9e52a2402586a1ee5ca7c9d59e6e545f8d0e7330a3ebe

See more details on using hashes here.

File details

Details for the file libclang_ng-21.1.8.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl.

File metadata

File hashes

Hashes for libclang_ng-21.1.8.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 82351814464d32fb5645a9dd5789a6343400daba60e23ec76e85963b5303fd38
MD5 25c3d86f7907632369a00e06bc476eda
BLAKE2b-256 fe3241db207435f54da0af690e16a1762b8ae57c380538717f664e5273bc53fd

See more details on using hashes here.

File details

Details for the file libclang_ng-21.1.8.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl.

File metadata

File hashes

Hashes for libclang_ng-21.1.8.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 163aa1fe74eae27a67e5ea183bd27d5ae47425e17e02934e55a3a9a421b055c0
MD5 db0b022821bc70fde975080447e3f647
BLAKE2b-256 66aac97083f31fd3952572fad5e75afa9224b4ceac55c97a1552c07fd76e15aa

See more details on using hashes here.

File details

Details for the file libclang_ng-21.1.8.2-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for libclang_ng-21.1.8.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f938af8c28e8ee7fd3ba5da7ed5b79452f29bfb51391e75abd983a0ea5b72e67
MD5 2f42e58a6a8171954e3541a4d2c9fd9c
BLAKE2b-256 abc80e4c19b65ce305f2c1cd73c493ec0f0d8e77044dc60eac73c8bc9682f885

See more details on using hashes here.

File details

Details for the file libclang_ng-21.1.8.2-py3-none-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for libclang_ng-21.1.8.2-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d61e6d149b4b1c52785a2c01cd02f538f35de8e4aa3f29b838704d7c6d5bae54
MD5 4eb7e042ff2ce8394a9d2826b9a78e08
BLAKE2b-256 94da929c07c0a1f46ca4460414d260f84e88b3d2d15ba1083a8e409332f04c83

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page