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

Uploaded Python 3Windows ARM64

libclang_ng-19.1.7.2-py3-none-win_amd64.whl (23.4 MB view details)

Uploaded Python 3Windows x86-64

libclang_ng-19.1.7.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (27.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

libclang_ng-19.1.7.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (26.9 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

libclang_ng-19.1.7.2-py3-none-macosx_11_0_arm64.whl (29.6 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

libclang_ng-19.1.7.2-py3-none-macosx_10_9_x86_64.whl (30.6 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 551d89e52410d8ba1bb8fc7e5c4699c4768b894eb132fa6b063fe5ae24e264fe
MD5 091db4f3187cc20992357c90c4915d9b
BLAKE2b-256 30c3e38d87f1a9160b66d33f4e6114dbb94f2ee3a4fa9d64e5f3d3c2045f8614

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 1b281416ff6e98a09add6b1ba55de9f39411a3cd89c3f4719edcfcfac99a411a
MD5 51857b3c44bd2fc1dd8f207dd0c9206a
BLAKE2b-256 3a839d0a1eb44ae15693751a90e5a9a6d3aea432691940cc79b3787d7225dbcf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 3e83ee0695481c78c23c52bca8a837730634034b4df38ccc667901c6ef075493
MD5 97035d299030c42eefb6d4958f03c17e
BLAKE2b-256 c798aade63276029d37583238d9555d9bfab0ea3744cb06848de0284d1c6665f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 68624743969a3dd944eb6b6466d7c31c31c2dfcb7a866a331f1ef724cb73b253
MD5 b000c0c4a4a9864cd8830e398534fbd5
BLAKE2b-256 dd62b985858b7caaf684d1da9ca81984444c26991284ba2c2e9b01e2059e9215

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 835fa3ff1ff0365a6e19b4a1fc13f9464229e70bcd0106f5464cdc1d280f118f
MD5 edeace6951780355787e6c3b7cbb2f1a
BLAKE2b-256 39e72bac5e01c709bdf54ab6c4fc7801e88a74e5fc43d412a98c5e5a59de652c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.2-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 d6bb037d53f3c4fcfc36a3e5a21242fdcbba3f89e1b2b9f787f75b15d2569ec3
MD5 cac57b504667e505d297db7917d0065d
BLAKE2b-256 808908c472af70466fa79bca7749b5376c01c254a109015f7d43ccdee9c9263c

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