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

Uploaded Python 3Windows ARM64

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

Uploaded Python 3Windows x86-64

libclang_ng-22.1.4.1-py3-none-manylinux_2_28_x86_64.whl (31.6 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

libclang_ng-22.1.4.1-py3-none-manylinux_2_28_aarch64.whl (29.8 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

libclang_ng-22.1.4.1-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.1-py3-none-win_arm64.whl.

File metadata

File hashes

Hashes for libclang_ng-22.1.4.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 868e9975f425583e540c95c9480bc349ff063d003b9f1baa5490755f59e9c2fc
MD5 1f2f4dbb9aa1c6349495c2f7474bb0e9
BLAKE2b-256 2979b34f7f832707bdcd29ba80b8941d9c4477de767d73638cf5fbf22a246559

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 27da39f3b2e5d251b6dff15fef7e6cfb8bd27c2d131d8020658b9f843c4e3420
MD5 d8dd33a09e58f44fcdd6aeab917ec7e6
BLAKE2b-256 18735460837ed2dfe7aad87e0396ce0143a39ee884912ce666bf0de0da62f698

See more details on using hashes here.

File details

Details for the file libclang_ng-22.1.4.1-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for libclang_ng-22.1.4.1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 ee3a0bede8fdbe6eff999f4799bb752b8bd6b132f080b70a82d18f8ab61775ab
MD5 ffb7fbca3e53d64b894c69fd233370f1
BLAKE2b-256 d8dd923be51dbcf5a0df44cb7826af712031dec0d597727ea212af15b6ec80b4

See more details on using hashes here.

File details

Details for the file libclang_ng-22.1.4.1-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for libclang_ng-22.1.4.1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 4c21cd2f586856383845bb76d36b4b5c2f9cde78dc1d126961a2efc8bed2dad0
MD5 0b595508c369a25f4bae72732414a583
BLAKE2b-256 39881256eb9b1dd8ac44c523736fe314824e51d36b0bf5250e2fceefcaa4db93

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 f5b827f1d47133ada5dec7b28b18d6c03aedfe6a83c13e1ea0438ffb495963e8
MD5 3d6637ad79caa07430e9a36f4de9641e
BLAKE2b-256 43c9ebe26f9647d59de390332fc14dd2bc5ed8bab8b7d5753e56cd5df642e18f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-22.1.4.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 adfeba5547a924a69e92f821a67272b9201c0a38e2d79bb7bb07c75e9cebe904
MD5 0fe38530a48e9e41d3eea019fce95398
BLAKE2b-256 4bc80bfc3bfb08e13eaba35f3bca23b91f46594d4eff6ef2c0b9795e5eb490b2

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