J'écris une application pour l'abattage des applications Ubuntu et j'essaie de lire/écrire la photo de profil de l'utilisateur à l'aide de cette
>>> 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
Mais apparemment, ça ne marche pas. Existe-t-il un autre moyen d'utiliser AccountsService avec Python? Je n'ai pas pu trouver plus de documentation sur AccountsService et Python.
PS: pour tester cet exemple, vous devez installer gir1.2-accountsservice-1.0
sur Ubuntu 12.04.
$ Sudo apt-get install gir1.2-accountsservice-1.0
Après avoir examiné la source de libaccountsservice, vous devez attendre que l'utilisateur soit chargé avant d'accéder à l'objet utilisateur. Cela donne le résultat:
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()
Vous pouvez également contacter le service des comptes directement et de manière synchrone via 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']
Si vous souhaitez définir le fichier d'icône, vous devez appeler la méthode appropriée:
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)
Si vous devez utiliser d'autres méthodes, parcourez l'interface D-Bus à l'aide de D-Feet (dans le centre logiciel).