- 20
- Sep
这个週末本来想Web开发的,不巧被山猫(也可称雪梨,花花等等)的《在 Python3 通过 ctypes 直接使用 Gtk 编写 GUI》所诱惑,于是也想用ctypes来搞Ubuntu Tweak的PolicyKit,这样就不需要用C代码,软件包也不用分i386和amd64了。
于是花了点时间,用纯python开始实现“dbus的消息二度分发机制”和“Policykit验证”。虽然最后还没有实现我想要的,但是已经比较接近了,遂纪录一下。
所谓“dbus的消息二度分发机制”和“Policykit验证”就是运行一个具备特权的daemon,用于进行PolicyKit验证,如果通过则将应用程序传来的dbus请求再分发至其他backends。这招是向Ubuntu的system-tools-backends学来的,目前正应用于Ubuntu Tweak。
不爽的地方是,PolicyKit只提供了C的API,我不得不用C写了这个daemon,软件包变成了i386和amd64,还分N个发行版(因为ABI不兼容)。这一直让我心里很不舒服,毕竟之前Ubuntu Tweak只提供一个单一的deb软件包,就能运行在所有平台上了。
后来我学习了下ctypes,用来调用C的so确实比较方便,但似乎也有局限性,比如我一直无法找到如何来表示enum。而大多数情况下,确实可以很方便地调用C的API,返回的东西也是“指针”。
然后python dbus的东西搞了很久,把messge相关的东西算熟悉了一把,主要是member, destination, sender, interface, path,以前总是不明白dbus搞什么bus_name, interface还有object_path,因为这三者几乎是一样的,除了object_path是用“/”来代替“.”。
现在终于大概明白了,实际上interface就是平常编程中的接口的概念。比如你可以用“org.freedesktop.DBus.Introspectable”这个接口去查询任意的bus_name,就可以获取该bus_name的相关信息。
最普遍的一个dbus消息是,每当一个对象成功的建立起自己的bus_name以后,来自org.freedesktop.DBus(bus_name)的/org/freedesktop/DBus(object_path)对象就会应用org.freedesktop.DBus(interface)来向该对象发送一个“NameAcquired”的消息,告诉它已经成功拥有该Name了。这是我用add_message_filter查询了很多消息才明白的。
最后,我不知道Ubuntu Tweak何时才会再一次转向真正的纯Python,但是可以肯定的是,Ubuntu 9.10的PolicyKit的dbus接口是相当全面的,也就是说我将不需要C代码也能在9.10下实现相关功能了。
就这样,慢慢地再次进化吧。
BTW:作为一个Linux桌面应用程序的开发者,我深感Linux桌面的“不稳定”,新事物和新东西来的太多太快了,用那些新库(如PolicyKit),一定要谨慎,除非它已经达到了1.0版本,或者所有的桌面都已经应用(KDE 4在近期已经用上了吧),否则尽量不要去用。不然应用程度的可移植性不好,并且它本身的升级也将影响应用程序的开发。
明年GTK+3.0出来时,会不会也有一大堆break呢?
死晕,版本的不兼容问题。
难道以后调用库都要先自己包装一下?
莫非是沙发?最近刚开始用python写东西,发现python很好用阿
习惯了用python 越来越不喜欢用c
enum 不就是 整数 么,要啥表示哇
似乎C都忘记的差不多了..
enum就是整数啊
123