Modern Python D-Bus library. Based on sd-bus from libsystemd.
Project description
Modern Python library for D-Bus
Features:
- Asyncio and blocking calls.
- Type hints. (
mypy --strictcompatible) - 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
- D-Bus (built-in)
- Freedesktop Notifications
- Network Manager
- Freedesktop Secrets
More incoming. (systemd, Bluez, screen saver... )
Community interfaces
- systemd (by @bernhardkaindl)
- modemmanager (by @zhanglongqi)
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,aarch64orarmv7larchitecture.- 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-devpackage on ubuntu) - GCC.
- libsystemd or libelogind
- libsystemd headers. (
libsystemd-devpackage 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file sdbus-0.14.0.tar.gz.
File metadata
- Download URL: sdbus-0.14.0.tar.gz
- Upload date:
- Size: 89.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
41d61b76cc05a9ea41d10d70a11e9f9a86ed95f40f713630c5e18340e0e4c76f
|
|
| MD5 |
69a256ea1c25105461a3955ac68e3ea7
|
|
| BLAKE2b-256 |
179a1dc010428fa1f444809d9aa1adb3ce231dae891b5f33635d8f4d7a8e33fd
|
File details
Details for the file sdbus-0.14.0-cp39-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: sdbus-0.14.0-cp39-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 741.1 kB
- Tags: CPython 3.9+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d38597858490c2063dd3de508942688075089843ef851fb8c062cb393e8b99d5
|
|
| MD5 |
0468f9c57f5f74ec33e2272344f66906
|
|
| BLAKE2b-256 |
b6744a00d5dcf0037e132db404bcc770d0e49c9c088a373e8916ef8e9eb074cf
|
File details
Details for the file sdbus-0.14.0-cp39-abi3-manylinux_2_28_armv7l.whl.
File metadata
- Download URL: sdbus-0.14.0-cp39-abi3-manylinux_2_28_armv7l.whl
- Upload date:
- Size: 696.8 kB
- Tags: CPython 3.9+, manylinux: glibc 2.28+ ARMv7l
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
46f60ee66f18f0a3b9cb19639bc8a9ada62cd7f89343bba8a3140c0563885561
|
|
| MD5 |
a031101601b785ebd84d1043154e575f
|
|
| BLAKE2b-256 |
9f6847baafb1cc32ef18e45d6e1f0f8ca99864d582d59da855e035c1ce3fed13
|
File details
Details for the file sdbus-0.14.0-cp39-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: sdbus-0.14.0-cp39-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 768.0 kB
- Tags: CPython 3.9+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.0.1 CPython/3.13.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a5b9315090ffbe232c82edc3e6f1a449ed27c7ef7f3ebc81d73326057fba8f1
|
|
| MD5 |
6b623fdb1d891990a18006926eccb58e
|
|
| BLAKE2b-256 |
e7decc625bd2c61a1ba917b7ef9f7bec5357e1d4f68ba204b3d71cf038facade
|