如何使用Python与AccountsService API?

我正在为Ubuntu应用展示会编写一个应用程序,我试图使用这个来读取/写入用户的个人资料图片。
>>> from gi.repository import AccountsService, GLib
>>> current_user = GLib.get_user_name()
>>> user = AccountsService.UserManager.get_default().get_user(current_user)
>>> print user.get_icon_file()
None
>>> print user.get_user_name()
None

但显然无效。有没有其他方法可以在Python中使用AccountsService? 我找不到更多关于AccountsService和Python的文档。

附注:要测试此示例,您需要在Ubuntu 12.04上安装gir1.2-accountsservice-1.0

$ sudo apt-get install gir1.2-accountsservice-1.0

1哇。关于AccountsService没有任何文档可供参考。没有手册,也没有来自.deb文件的文档。什么都没有。希望有人能提供对此有深入了解的意见。 - Christian Smith
对于那些仍然在为此苦苦挣扎的人,lazka现在提供了文档:https://lazka.github.io/pgi-docs/AccountsService-1.0/index.html - andy.holmes
1个回答

在查看libaccountsservice的源代码后,实际上你必须等待用户加载完成后才能访问用户对象。这样可以达到预期的结果。
from gi.repository import AccountsService, GLib

current_user = GLib.get_user_name()
user = AccountsService.UserManager.get_default().get_user(current_user)
def is_loaded_cb(user, param):
    print user.get_icon_file()
user.connect('notify::is-loaded', is_loaded_cb)

main_loop = GLib.MainLoop()
main_loop.run()

或者,您可以直接通过D-Bus与账户服务进行同步联系。
from gi.repository import GLib, Gio

current_user = GLib.get_user_name ()
bus = Gio.bus_get_sync (Gio.BusType.SYSTEM, None)
result = bus.call_sync ('org.freedesktop.Accounts',
                        '/org/freedesktop/Accounts',
                        'org.freedesktop.Accounts',
                        'FindUserByName',
                        GLib.Variant ('(s)', (current_user,)),
                        GLib.VariantType.new ('(o)'),
                        Gio.DBusCallFlags.NONE,
                        -1,
                        None)
(path,) = result.unpack ()

result = bus.call_sync ('org.freedesktop.Accounts',
                        path,
                        'org.freedesktop.DBus.Properties',
                        'GetAll',
                        GLib.Variant ('(s)', ('org.freedesktop.Accounts.User',)),
                        GLib.VariantType.new ('(a{sv})'),
                        Gio.DBusCallFlags.NONE,
                        -1,
                        None)
(props,) = result.unpack ()
print props['IconFile']
print props['RealName']

如果你想设置图标文件,你需要调用适当的方法:
result = bus.call_sync ('org.freedesktop.Accounts',
                       path,
                       'org.freedesktop.Accounts.User',
                       'SetIconFile',
                       GLib.Variant ('(s)', ('/tmp/somefile.png',)),
                       GLib.VariantType.new ('()'),
                       Gio.DBusCallFlags.NONE,
                       -1,
                       None)

如果你需要使用其他方法,可以通过 D-Feet(在软件中心)浏览 D-Bus 接口。