zerodds-py 1.0.0-rc.1

PyO3 bindings for the ZeroDDS DCPS API
Documentation

zerodds (Python)

Python-Bindings für ZeroDDS, die native Rust-DDS-Implementation.

Installation (Dev-Setup)

# Maturin in einem virtualenv
python3 -m venv .venv
source .venv/bin/activate
pip install maturin pytest

# Build + install in develop mode (rebuild on code change)
cd crates/py
maturin develop --features extension-module

Schnellstart

import zerodds

factory = zerodds.DomainParticipantFactory.instance()
participant = factory.create_participant(0)

topic = participant.create_bytes_topic("Chatter")
publisher = participant.create_publisher()
writer = publisher.create_bytes_writer(topic)

subscriber = participant.create_subscriber()
reader = subscriber.create_bytes_reader(topic)

writer.wait_for_matched_subscription(1, timeout_secs=5.0)
reader.wait_for_matched_publication(1, timeout_secs=5.0)

writer.write(b"hello world")
reader.wait_for_data(timeout_secs=3.0)
for payload in reader.take():
    print(payload)

Tests

pytest crates/py/python/tests/

Scope (aktuelle Version)

  • DomainParticipantFactory, DomainParticipant mit assert_liveliness, ignore_*, contains_entity, get_discovered_*
  • BytesTopic / BytesWriter / BytesReader für opaken Payload
  • ShapeTopic / ShapeWriter / ShapeReader + Shape-Dataclass für Cross-Vendor-Interop gegen Cyclone-/Fast-DDS-ShapesDemo
  • Status-Getter: publication_matched_status, liveliness_lost_status, subscription_matched_status, sample_lost_status, …
  • GuardCondition + WaitSet
  • Sync-Primitives: wait_for_matched_*, wait_for_data
  • GIL-Release während allen blocking Calls

Roadmap

  • IDL→Python-Dataclass-Generator (@dataclass aus IDL); dann funktionieren beliebige DdsType native aus Python.
  • ROS2-pytest-Integration + Multi-Process-Live-Tests + sphinx-Docs.
  • QoS-Profile aus XML/YAML laden (analog Fast-DDS QoS Profiles Manager).

Architektur

Das Rust-Crate zerodds-py baut als cdylib (zerodds._core). Der Python-Wrapper python/zerodds/__init__.py re-exportiert und fügt bei Bedarf pythonischen Zucker hinzu.

Der Rust-Kern ist identisch zum Rust-API — keine Python- spezifische Business-Logik, nur Type-Conversions + GIL-Release. Das hält das Binding dünn und hält die DDS-Semantik auf einer Stelle.