Python无法通过dbus找到compiz服务
好的,先说明一下,我对dbus和perl的了解不多,所以可能会说错一些东西。
我想用dbus来编程控制compiz这个程序。看了compiz的维基百科 http://wiki.compiz.org/Plugins/Dbus,发现用python来做这件事似乎是最简单的。所以我写了这个
import sys, dbus, subprocess
bus = dbus.SystemBus()
bus.get_object('org.freedesktop.compiz','/org/freedesktop/compiz')
不过,这样做遇到了问题,因为dbus似乎找不到compiz的dbus服务。语法是对的,使用org.freedesktop.EverythingElse是可以的。
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.ServiceUnknown: 没有任何.service文件提供名称org.freedesktop.compiz
奇怪的是,我在网上搜索了一下,找到一个perl脚本可以列出服务(使用org.freedesktop.DBus),结果显示compiz在其中。
而且,perl似乎可以使用compiz服务。但是,我觉得我不能用perl来写脚本,因为我对perl不太熟悉,也不太了解dbus的工作原理,这样做会让我很头疼。
我想用compiz做一些事情,比如切换工作区。我想我可以用模拟按键的方式来实现,但这太像是个临时解决方案了,我可能还想添加一些更高级的功能。
这是一个新安装的arch-linux,所以我在想我是不是缺少了某个软件包。
1 个回答
D-Bus 有几个不同的 总线——一个是“系统”总线,它总是可用的,主要供系统守护进程和服务使用;还有多个“会话”总线1,每个 X11 会话都有一个,用于你自己的程序连接。
Compiz 连接的是 会话总线,因为它是一个用户程序(不是系统守护进程,所以没有相应的权限),而且可以在多个会话中运行(如果所有实例都连接到同一个系统总线,只有第一个实例可以使用这个总线名称)。
bus = dbus.SessionBus() bus.get_object('org.freedesktop.compiz','/org/freedesktop/compiz')
你可以使用 D-Feet 来查看所有连接到系统和会话总线的程序。
1 未来的说明:曾经有多个建议提出要引入一个“用户”总线,让同一个用户的所有会话共享,而不再使用“会话”总线,但这还没有实现。