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-22.1.4.2-py3-none-win_arm64.whl (23.5 MB view details)

Uploaded Python 3Windows ARM64

libclang_ng-22.1.4.2-py3-none-win_amd64.whl (26.2 MB view details)

Uploaded Python 3Windows x86-64

libclang_ng-22.1.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (30.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

libclang_ng-22.1.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (29.6 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

libclang_ng-22.1.4.2-py3-none-macosx_11_0_arm64.whl (33.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

libclang_ng-22.1.4.2-py3-none-macosx_10_9_x86_64.whl (33.9 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 a76d7748d13fd47c0a604bfb752c5957171dbd715796daad8cd21b19fe5d8bcf
MD5 1459fa76378607ed023bfccd148fae0d
BLAKE2b-256 b405de1e969a73ac5412b06bb72361c7763767c87be3d7eee12963afa155621f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 701b282404800d3fcf6d7d408cfd49ebae3e6a85dfb3f80a920deba67000dfa9
MD5 0cf131063bb2cf344651f9ea419a7620
BLAKE2b-256 bb2145df66fce5a3d9cf6b42131d1ecc1423bc1f70b8304e27c1ccb3edd40eae

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 be0c485e086b1fd66fab5441df8507e863838f5b84f8cd327fe1eda2e93fb07a
MD5 75c60b19d5de9c3b105ea99ed250582e
BLAKE2b-256 295b465354e121f7e4ab0023e464d1e5f09165460b0aefbd2fe6250a57620e6d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 41ee012632993d0ea25c60da539d63ad858bc3261aaa706e5a4286bd2afc8372
MD5 26ebb6f5478e09cdef0e1441a529c33a
BLAKE2b-256 61c6ef0cae4dfb871eaae6811fb7873c64366ca7065ea1a590e858b267a96514

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 959cb4b15883b19e56704a68eceea015674c0830ecea423aa72e920225cf50ef
MD5 3694214f7d8ec3b02b809c184cb351b3
BLAKE2b-256 e22b67a2cc4b12c0c7ce1e918e74f0f7fcd40f4509b6a1a1f3b18bd438098b6e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.2-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 25c2a760f92e5a05f70b363e59607a97341a7a778c30b2987cea4bf186c56b57
MD5 922913aced33db0b0010539f8a2bc701
BLAKE2b-256 9d7993dd7866db6c0b37e1f93abfcc8e87879a46ecd5f52ca46673dd63ff605a

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