Como usar a API do AccountsService com o Python?

7

Estou escrevendo um aplicativo para o showdown do aplicativo Ubuntu e tento ler / escrever a foto do perfil do usuário usando esta

>>> 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

Mas aparentemente não funciona. Existe outra maneira de usar o AccountsService com o Python? Não consegui encontrar mais documentação sobre o AccountsService e o Python.

PS: para testar este exemplo, você precisa instalar o gir1.2-accountsservice-1.0 no Ubuntu 12.04.

$ sudo apt-get install gir1.2-accountsservice-1.0
    
por pabluk 20.06.2012 / 23:10

1 resposta

6

Depois de olhar a fonte para o serviço libaccounts, você precisa esperar que o usuário seja carregado antes de acessar o objeto do usuário. Isso alcança o resultado:

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()

Como alternativa, você pode contatar o serviço de contas diretamente e de forma síncrona pelo 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']

Se você quiser definir o arquivo de ícone, precisará chamar o método apropriado:

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)

Se você precisar usar qualquer outro método, navegue na interface do D-Bus usando D-Feet (no centro de software).

    
por Robert Ancell 21.06.2012 / 23:35