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

Uploaded Python 3Windows ARM64

libclang_ng-19.1.7.1-py3-none-win_amd64.whl (20.9 MB view details)

Uploaded Python 3Windows x86-64

libclang_ng-19.1.7.1-py3-none-manylinux_2_28_x86_64.whl (26.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

libclang_ng-19.1.7.1-py3-none-manylinux_2_28_aarch64.whl (24.5 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

libclang_ng-19.1.7.1-py3-none-macosx_11_0_arm64.whl (27.2 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

libclang_ng-19.1.7.1-py3-none-macosx_10_9_x86_64.whl (28.1 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 8b90bd265d5055c8a620fef7d5ce657560421498facfde1a1a3fe45e19a62202
MD5 9c7cf75c89ca3159182a8da6eae96205
BLAKE2b-256 0bc0827ab550a1c40d224bec937b6af519cc66afb9a2cd089da54eb321a7a21e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 5e0095162b77805135a15bdd758f087c297cd4246f4c9099a90a983af70fadd9
MD5 f75e4963bc315d3ba51abb40262e9c5b
BLAKE2b-256 a747a93be332e08b1f98384f01f4b61bbaad060247d50083bbdbffdd5fe94aa9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 77fb0f1f4562df304f5b82126e78fdbf1fa9bf81dabd1f64df35af6f74115ac2
MD5 d15a252f611cb76b13558e0de93a68ca
BLAKE2b-256 a78790c5a97482ed593d823af6f67ab3b10850c2295070c7ffa00ce439eaf7dd

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bdc340542d995706f1f6d9f47ab61cd2e1457807544e99592e4e4e821c16b616
MD5 90b305950f95113a1ec71a30d3177eab
BLAKE2b-256 b1f673043022057adb2da5a8a353a9ee26c960f40ef8c08ee5fab23abe97a47d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 3d8f953e841e8cad94fdf125442fe9cd4a66abe9bd75b40b9f7256708733f973
MD5 eccc7f3138d577765d09c4c03fbcb81f
BLAKE2b-256 75b7c8616c15c2696e8572ed00eb306773fedfd9b45474b2c50d7757eb089145

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-19.1.7.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 970392c28e2e829bdcb008b5d91feebedb5c300bf8c5e0e3490f5c3dd74ab917
MD5 1b6510a17ded1edf2ae60846406f6371
BLAKE2b-256 664631a6afb2394320f27fe5eeacb244829626635e4a4684e93a2969a0bda7f9

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