支持异步的python零依赖dbus库
dbus-next的Python项目详细描述
python dbus下一步
下一个伟大的python dbus库。
该项目处于开发的早期阶段,公共api不稳定
python dbus next是一个用于dbus的python库,旨在成为一个功能齐全的高级库,主要用于将应用程序集成到linux桌面和移动环境中。
桌面应用程序开发人员可以使用此库通过实现公共dbus标准接口或创建自定义插件接口将其应用程序集成到桌面环境中。
桌面用户可以使用此库创建自己的脚本和实用程序,以便与这些界面交互,以自定义桌面环境。
python dbus下一步计划通过以下方式改进python的其他dbus库:
- 零依赖和纯python 3。
- 支持多个IO后端,包括Asyncio和Glib主循环。
- 适合于gui开发的非阻塞io。
- 针对python最新的语言特性,提供漂亮的服务和客户机。
- 完全实现dbus类型系统,无需猜测类型。
- 对库的所有功能进行集成测试。
- 完整的公共api文档。
安装
这个库在pypi上可用作dbus-next。
pip3 install dbus-next
客户端接口
客户端接口有点稳定
要在总线上使用服务,库将构造一个代理对象,您可以使用该对象来调用方法、获取和设置属性以及侦听信号。
有关详细信息,请参见overview for the high-level client。
此示例连接到媒体播放器并使用MPRISdbus接口控制它。
fromdbus_next.aioimportMessageBusimportasyncioloop=asyncio.get_event_loop()asyncdefmain():bus=awaitMessageBus().connect()# the introspection xml would normally be included in your project, but# this is convenient for developmentintrospection=awaitbus.introspect('org.mpris.MediaPlayer2.vlc','/org/mpris/MediaPlayer2')obj=bus.get_proxy_object('org.mpris.MediaPlayer2.vlc','/org/mpris/MediaPlayer2',introspection)player=obj.get_interface('org.mpris.MediaPlayer2.Player')properties=obj.get_interface('org.freedesktop.DBus.Properties')# call methods on the interface (this causes the media player to play)awaitplayer.call_play()volume=awaitplayer.get_volume()print(f'current volume: {volume}, setting to 0.5')awaitplayer.set_volume(0.5)# listen to signalsdefon_properties_changed(interface_name,changed_properties,invalidated_properties):forchanged,variantinchanged_properties.items():print(f'property changed: {changed} - {variant.value}')properties.on_properties_changed(on_properties_changed)awaitloop.create_future()loop.run_until_complete(main())
服务接口
服务接口有些稳定
要在总线上定义服务,请使用ServiceInterface
类和修饰类方法指定dbus方法、属性和带有其类型签名的信号。
有关详细信息,请参见overview for the high-level service。
fromdbus_nextimportServiceInterface,method,dbus_property,signal,Variantfromdbus_next.aioMessageBusimportasyncioclassExampleInterface(ServiceInterface):def__init__(self,name):super().__init__(name)self._string_prop='kevin'@method()defEcho(self,what:'s')->'s':returnwhat@method()defGetVariantDict()->'a{sv}':return{'foo':Variant('s','bar'),'bat':Variant('x',-55),'a_list':Variant('as',['hello','world'])}@dbus_property()defstring_prop(self)->'s':returnself._string_prop@string_prop.setterdefstring_prop_setter(self,val:'s'):self._string_prop=val@signal()defsignal_simple(self)->'s':return'hello'asyncdefmain():bus=awaitMessageBus().connect()awaitbus.request_name('test.name')interface=ExampleInterface('test.interface')bus.export('/test/path',interface)awaitasyncio.get_event_loop().create_future()asyncio.get_event_loop().run_until_complete(main())
低级接口
低级接口有点稳定
低级接口直接处理dbus消息。
有关详细信息,请参见overview for the low-level interface。
fromdbus_next.messageimportMessage,MessageTypefromdbus_next.aioimportMessageBusimportasyncioimportjsonloop=asyncio.get_event_loop()asyncdefmain():bus=awaitMessageBus().connect()reply=awaitbus.call(Message(destination='org.freedesktop.DBus',path='/org/freedesktop/DBus',interface='org.freedesktop.DBus',member='ListNames'))ifreply.message_type==MessageType.ERROR:raiseException(reply.body[0])print(json.dumps(reply.body[0],indent=2))loop.run_until_complete(main())
接下来使用python dbus的项目
贡献
欢迎捐款。发展发生在Github。
在提交之前,运行make
以运行linter、代码格式化程序和测试套件。
版权所有
您可以在麻省理工学院的许可证下使用此代码(请参阅许可证)。
?2019年,托尼·克里斯蒂