Skip to main content

Modern Python D-Bus library. Based on sd-bus from libsystemd.

Project description

Documentation Status PyPI - Version

Modern Python library for D-Bus

Packaging status

Features:

  • Asyncio and blocking calls.
  • Type hints. (mypy --strict compatible)
  • No Python 2 legacy.
  • Based on fast sd-bus from systemd. (also supports elogind)
  • Unified client/server interface classes. Write interface once!
  • D-Bus methods can have keyword and default arguments.

See the documentation for tutorial and API reference.

List of implemented interfaces

More incoming. (systemd, Bluez, screen saver... )

Community interfaces

Stability

Python-sdbus is under development and its API is not stable. Generally anything documented in the official documentation is considered stable but might be deprecated. Using deprecated feature will raise a warning and the feature will be eventually removed.

See the deprecations list.

If there is a feature that is not documented but you would like to use please open a new issue.

Requirements

Binary package from PyPI

  • Python 3.9 or higher.
  • x86_64, aarch64 or armv7l architecture.
  • glibc 2.28 or higher. (Debian 10+, Ubuntu 18.10+, CentOS/RHEL 8+)
  • pip 20.3 or higher.

libsystemd is statically linked and is not required to be installed on the system.

Pass --only-binary ':all:' to pip to ensure that it installs binary package.

i686, ppc64le and s390x can be supported if there is a demand. Please open an issue if you are interested in those platforms.

Source package or compiling from source

  • Python 3.9 or higher.
  • Python headers. (python3-dev package on ubuntu)
  • GCC.
  • libsystemd or libelogind
  • libsystemd headers. (libsystemd-dev package on ubuntu)
  • Python setuptools.
  • pkg-config

Systemd version should be higher than 246.

Optional dependencies

  • Jinja2 for code generator.
  • Sphinx for autodoc.

Installation

PyPI

URL: https://pypi.org/project/sdbus/

pip install --only-binary ':all:' sdbus

AUR

URL: https://aur.archlinux.org/packages/python-sdbus-git/

Example code

Interface example_interface.py file:

from sdbus import (DbusInterfaceCommonAsync, dbus_method_async,
                   dbus_property_async, dbus_signal_async)

# This is file only contains interface definition for easy import
# in server and client files

class ExampleInterface(
    DbusInterfaceCommonAsync,
    interface_name='org.example.interface'
):
    @dbus_method_async(
        input_signature='s',
        result_signature='s',
    )
    async def upper(self, string: str) -> str:
        return string.upper()

    @dbus_property_async(
        property_signature='s',
    )
    def hello_world(self) -> str:
        return 'Hello, World!'

    @dbus_signal_async(
        signal_signature='i'
    )
    def clock(self) -> int:
        raise NotImplementedError

Server example_server.py file:

from asyncio import new_event_loop, sleep
from random import randint
from time import time

from example_interface import ExampleInterface

from sdbus import request_default_bus_name_async

loop = new_event_loop()

export_object = ExampleInterface()


async def clock() -> None:
    """
    This coroutine will sleep a random time and emit
    a signal with current clock
    """
    while True:
        await sleep(randint(2, 7))  # Sleep a random time
        current_time = int(time())  # The interface we defined uses integers
        export_object.clock.emit(current_time)


async def startup() -> None:
    """Perform async startup actions"""
    # Acquire a known name on the bus
    # Clients will use that name to address this server
    await request_default_bus_name_async('org.example.test')
    # Export the object to D-Bus
    export_object.export_to_dbus('/')


loop.run_until_complete(startup())
task_clock = loop.create_task(clock())
loop.run_forever()

Client example_client.py file:

from asyncio import new_event_loop

from example_interface import ExampleInterface

# Create a new proxied object
example_object = ExampleInterface.new_proxy('org.example.test', '/')


async def print_clock() -> None:
    # Use async for loop to print clock signals we receive
    async for x in example_object.clock:
        print('Got clock: ', x)


async def call_upper() -> None:
    s = 'test string'
    s_after = await example_object.upper(s)

    print('Initial string: ', s)
    print('After call: ', s_after)


async def get_hello_world() -> None:
    print('Remote property: ', await example_object.hello_world)

loop = new_event_loop()

# Always bind your tasks to a variable
task_upper = loop.create_task(call_upper())
task_clock = loop.create_task(print_clock())
task_hello_world = loop.create_task(get_hello_world())

loop.run_forever()

License

Python-sdbus is licensed under LGPL-2.1-or-later.

The LGPL license is an extension of GPL license therefore both licenses' texts are required.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

sdbus-0.14.2.tar.gz (89.9 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

sdbus-0.14.2-cp39-abi3-manylinux_2_28_x86_64.whl (742.2 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ x86-64

sdbus-0.14.2-cp39-abi3-manylinux_2_28_armv7l.whl (698.0 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARMv7l

sdbus-0.14.2-cp39-abi3-manylinux_2_28_aarch64.whl (769.1 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.28+ ARM64

File details

Details for the file sdbus-0.14.2.tar.gz.

File metadata

  • Download URL: sdbus-0.14.2.tar.gz
  • Upload date:
  • Size: 89.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for sdbus-0.14.2.tar.gz
Algorithm Hash digest
SHA256 4f5d13b196e1e1de35311ebb2563a32de791451a30f5b9a4894528ba98766412
MD5 b7b98bfd8934b676a48a9e4c6c180f8e
BLAKE2b-256 7c0f0cf6b2fb0338fb3ab564cb8a8d68aa1c6de767851f5f9de9a3c83dbabeab

See more details on using hashes here.

File details

Details for the file sdbus-0.14.2-cp39-abi3-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for sdbus-0.14.2-cp39-abi3-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 8a64bbb6280104efeb24a9632a9ebd5504e9c9c1349594142bbe50e734f16c83
MD5 fa7fe654a005c7022678420e7d5dbc4e
BLAKE2b-256 0ff8416467419d3345763372aaa51ef389fc95d0bd210679561edb63daa49933

See more details on using hashes here.

File details

Details for the file sdbus-0.14.2-cp39-abi3-manylinux_2_28_armv7l.whl.

File metadata

File hashes

Hashes for sdbus-0.14.2-cp39-abi3-manylinux_2_28_armv7l.whl
Algorithm Hash digest
SHA256 019871c00d9c2eeb5b40c3f3c94ff1d6579a49e245d6ecaf3bd9e245c4b248bc
MD5 31521781c70b45878dc23bec345e9da1
BLAKE2b-256 3a0b043869e8e53fe267b0fc9a98688f8ec9131ae2761a1665ee7c553b67ba69

See more details on using hashes here.

File details

Details for the file sdbus-0.14.2-cp39-abi3-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for sdbus-0.14.2-cp39-abi3-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 fbed8db91668ad537089c42a71d30e2472faa2e6616a461441ab0d51344a461c
MD5 68407e7ecfb6181da189e0f46128d4e3
BLAKE2b-256 6be043d2c3e0cc6f6c345df5f3230e2a9c62bd8ae8608d401f582ccf943da14d

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