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==19.1.7

Install using uv:

uv pip install libclang-ng==19.1.7

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" --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-20.1.8.1-py3-none-win_arm64.whl (18.8 MB view details)

Uploaded Python 3Windows ARM64

libclang_ng-20.1.8.1-py3-none-win_amd64.whl (21.4 MB view details)

Uploaded Python 3Windows x86-64

libclang_ng-20.1.8.1-py3-none-manylinux_2_28_x86_64.whl (27.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

libclang_ng-20.1.8.1-py3-none-manylinux_2_28_aarch64.whl (25.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

libclang_ng-20.1.8.1-py3-none-macosx_11_0_arm64.whl (27.9 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

libclang_ng-20.1.8.1-py3-none-macosx_10_9_x86_64.whl (28.9 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 7ebabe502d5bc8a443149c00d137d1f8eb52e74a94c34eeb36c1fe25609ab5af
MD5 1f6e551c87cd1b5884024eaf029e2279
BLAKE2b-256 a7eba471ae2eb9fa5170c624ec4a2296f6ada559ac721a0b170cd1fa5c0ffd4f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 870d7a52f30108286e5f7169eb7b43f188c39fcb3951bbb751c3ebee43765038
MD5 6c2bd5f85a4d9bb4433c7f3960f01ca7
BLAKE2b-256 2c1168a473b8670c1fa7e050996d4b7d2b04c3b409ca3bb3170bd2c472ce34fe

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e3b3ecadf1c4d38e3f725b340508b410cac2ab26c22a4df032496493439e51d0
MD5 64546ef8904c50cdb3781f2f967ae388
BLAKE2b-256 ed2b149a3c6fc87d9c05ec5c23e09b768da47eb1814bccf5f2e9664a8301cfe9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 70c34ab19e07208bb47f4f27ab7340325ca63bb36facb39d53e1551c3b66d7bb
MD5 7e2efed0c1a3e30631bd0ddbafe682c6
BLAKE2b-256 6cc6576b190b10b0e0c010465a48c99e32f506b5c12a89f0b35ac810afa9c27a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a6f366cb6f6941a33970bfdecc5ce54dd2579009030a57fe9370dc8edd3edbc6
MD5 4993eefa0b5cc5a5db5598dc834db78b
BLAKE2b-256 f2ae9f16c104b13713ad70f963250c05e214e4b641776cd0fbfe3fa96b9a4551

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.1-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7d12b3120043b9153777b27ccd98d829f914b02777f5b9cc4d34c34c46c99d3e
MD5 33746fa00c7d9902b6cb13aeaa4ec0e3
BLAKE2b-256 2af84686e8c78f70a5dbf36919c6e1f1b173996fb7eb26e37032be185bf6d15f

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