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

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.