cbridge
A Python library that provides a dataclass-like interface for creating ctypes structures, making it easier to work with C libraries and data structures in Python.
Features
- Dataclass-like syntax: Define C structures using familiar Python class syntax with type hints
- Automatic field management: Fields are automatically converted to ctypes types based on type annotations
- Array support: Built-in support for fixed-size arrays with proper type checking
- Pointer support: Easy handling of C pointers with type safety
- Default values: Support for default field values and factories
- Inheritance: Full support for class inheritance in C structures
- Memory layout control: Control structure packing and alignment
- C function binding: Decorator for easy binding to C library functions
Installation
pip install cbridge
Quick Start
Creating C Structures
from cbridge import CStruct
from cbridge import types
class Point(CStruct):
x: types.int32
y: types.int32
class Rectangle(CStruct):
top_left: Point
bottom_right: Point
color: types.uint32 = 0xFF0000 # Default value
# Create instances
point = Point(x=10, y=20)
rect = Rectangle(
top_left=Point(x=0, y=0),
bottom_right=Point(x=100, y=100)
)
print(rect) # Rectangle(top_left=Point(x=0, y=0), bottom_right=Point(x=100, y=100), color=16711680)
Working with Arrays
from typing import Literal
from cbridge import CStruct
from cbridge import types
class Data(CStruct):
id: types.int32
values: types.Array[types.int8, Literal[4]] # Array of 4 int8 values
name: types.char_ptr
# Create with array data
data = Data(id=1, values=[1, 2, 3, 4], name=b"test")
print(data.values) # [1, 2, 3, 4]
C Function Binding
from cbridge import cfunc
from cbridge import types
@cfunc("c") # Bind to libc
def time(t: types.Pointer[types.ctime_t]) -> types.ctime_t: ...
# Call the C function
current_time = time(None)
print(current_time)
Memory Operations
import array
from cbridge import CStruct
from cbridge import types
class Point(CStruct):
x: types.int32
y: types.int32
# Create from buffer
buffer = array.array("B", b"\x01\x00\x00\x00\x02\x00\x00\x00")
point = Point.from_buffer(buffer)
print(point) # Point(x=1, y=2)
Advanced Usage
Structure Packing
import ctypes
from cbridge import CStruct
from cbridge import types
class DefaultPackData(CStruct): # 1-byte alignment
a: types.char
b: types.int32
class Pack1Data(CStruct, pack=1): # 1-byte alignment
a: types.char
b: types.int32
print(ctypes.sizeof(DefaultPackData)) # 8 bytes
print(ctypes.sizeof(Pack1Data)) # 5 bytes
Default Values and Factories
from typing import Literal
from cbridge import CStruct
from cbridge import field
from cbridge import types
class Config(CStruct):
name: types.char_ptr
timeout: types.int32 = 30
flags: types.Array[types.int32, Literal[2]] = field(default_factory=lambda: [0, 1])
print(Config(name=b"test")) # Config(name=b'test', timeout=30, flags=[0, 1])
Pointer Operations
from cbridge import CStruct
from cbridge import types
from cbridge.types import pointer
class Node(CStruct):
data: types.int32
next: "types.Pointer[Node]"
# Create linked list
node1 = Node(data=1, next=None)
node2 = Node(data=2, next=pointer(node1))
node1.next = pointer(node2)
node = node1
data = []
for _ in range(8):
data.append(node.data)
node = node.next[0] # same as *node.next
assert data == [1, 2, 1, 2, 1, 2, 1, 2]
Metadata
Release files for cbridge 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| cbridge-0.2.2.tar.gz | 5.8 kB | Without provenance | Details for cbridge-0.2.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| cbridge-0.2.2-py3-none-any.whl | Python 3 | none | any | Details for cbridge-0.2.2-py3-none-any.whl |
Total release size: 12.5 kB
Release files / cbridge-0.2.2.tar.gz
| Download URL | cbridge-0.2.2.tar.gz |
|---|---|
| Size | 5.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
87644e33de9c349caa3999d117d2db4d651147487298c6486bc5b8057241100b
|
|
BLAKE2b-256 checksum How to use checksums |
49d26dc9873f3af53ae383d7e2977ff3c040045b6a1a959e6e48ddeec10bfc5e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Release files / cbridge-0.2.2-py3-none-any.whl
| Download URL | cbridge-0.2.2-py3-none-any.whl |
|---|---|
| Size | 6.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
851ba336140201c4e9e03cc2fdcc09a48264551770baefdaa02f92b98755b518
|
|
BLAKE2b-256 checksum How to use checksums |
89381190ab3ad6882cd1355b97655cb366a0ffa8d6304e7f07154ef4fdf4ad84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Security for cbridge 0.2.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.