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

Uploaded Python 3Windows ARM64

libclang_ng-20.1.8.2-py3-none-win_amd64.whl (25.8 MB view details)

Uploaded Python 3Windows x86-64

libclang_ng-20.1.8.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl (30.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ x86-64

libclang_ng-20.1.8.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl (29.5 MB view details)

Uploaded Python 3manylinux: glibc 2.17+ ARM64

libclang_ng-20.1.8.2-py3-none-macosx_11_0_arm64.whl (32.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

libclang_ng-20.1.8.2-py3-none-macosx_10_9_x86_64.whl (33.3 MB view details)

Uploaded Python 3macOS 10.9+ x86-64

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.2-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 9adf0721e5ca3ed1f39e789e6c5c9a8fdd4ca95ed7a2fd144c0f28d93e6bf738
MD5 5910d6869a442bce99c6a5bc41070162
BLAKE2b-256 db5c2c17fc8598eed430c6465d233c481bfeb3c286cdca786e098c16ec27d688

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.2-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 98fbb817c9131ddef0c88c208509963b95487c86368373c73f0534b3f8a90983
MD5 4ccc56c19ad79511496f88c84288a81b
BLAKE2b-256 32746ead4b8462cff86af7e223a41c7c8e4616bf9e3794a5e70528eac91618ea

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.2-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl
Algorithm Hash digest
SHA256 d07ab45008f1315813ea6d5ce3006ea218340649bf88ff250b60885b9fff091b
MD5 b92b54353064a6a86800c0a27431458c
BLAKE2b-256 760ccf5dc39e4d016d9932a840b76f0ee170f72356087d8a37441305a827376c

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.2-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl
Algorithm Hash digest
SHA256 500b7021ee0685c6e662cd7a76f14f6ccc9ff0918f5dca51aa2bdd52cd545408
MD5 b07d1b4dd15debe569b140ca81fc7880
BLAKE2b-256 06aaa890e308615c9377455466d7e75b94f05aad6fc76ca30116239449be60c5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 b2676ebd79bcd33ae1350d3830f2676c4be15c61c53f8cba078006b398a61af8
MD5 695e418975025ca393e20da03d6153a4
BLAKE2b-256 249b9e15eb487ec953337b74862b768d80f0f92faf6940e339a47dfbddac8890

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for libclang_ng-20.1.8.2-py3-none-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f469d43ea9ef7501b263ba26ad1808cc8987c8ea832730ad5c198e9c4f8cc055
MD5 eded023156fafcdd031c025ccf795939
BLAKE2b-256 d8e905a7fe31a0a8952fb9082b50b748052734d80a948c67d25a0ca39e955b14

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