Wie verwende ich die AccountsService-API mit Python?

7

Ich schreibe eine Anwendung für den Showdown der Ubuntu-App und versuche, das Profilbild des Benutzers damit zu lesen / schreiben

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

Funktioniert aber anscheinend nicht. Gibt es eine andere Möglichkeit, AccountsService mit Python zu verwenden? Ich konnte keine weitere Dokumentation zu AccountsService und Python finden.

PS: Um dieses Beispiel zu testen, müssen Sie es gir1.2-accountsservice-1.0unter Ubuntu 12.04 installieren .

$ sudo apt-get install gir1.2-accountsservice-1.0
pabluk
quelle
1
Beeindruckend. Es gibt KEINE Dokumentation zu AccountsService. Keine Manpage, keine Dokumente aus der .deb. Nichts. Hoffe, dass jemand, der intime Kenntnisse darüber hat, wiegt.
Senshikaze
Für Leute, die immer noch ihre Köpfe gegen eine Wand schlagen, hat Lazka jetzt eine Dokumentation dafür: lazka.github.io/pgi-docs/AccountsService-1.0/index.html
andy.holmes

Antworten:

6

Nachdem Sie sich die Quelle für libaccountsservice angesehen haben, müssen Sie tatsächlich warten, bis der Benutzer geladen ist, bevor Sie auf das Benutzerobjekt zugreifen. Dies führt zum Ergebnis:

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

Alternativ können Sie den Kontodienst direkt und synchron über D-Bus kontaktieren:

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

Wenn Sie die Symboldatei festlegen möchten, müssen Sie die entsprechende Methode aufrufen:

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)

Wenn Sie andere Methoden verwenden müssen, durchsuchen Sie die D-Bus-Schnittstelle mit D-Feet (im Software-Center).

Robert Ancell
quelle