Il s'agit d'une question complémentaire à Une liste des services DBus disponibles .
Le code python suivant répertorie tous les services DBus disponibles.
import dbus
for service in dbus.SystemBus().list_names():
print(service)
Comment répertorier les chemins d'objet sous les services en python? C'est correct si la réponse n'implique pas python bien que cela soit préféré.
J'utilise Ubuntu 14.04
Réponses:
Selon les documents officiels (sous les interfaces standard ):
Voici donc un exemple très simpliste qui devrait vous aider à démarrer. Il utilise
xml.etree.ElementTree
etdbus
:Il introspecte récursivement à
org.freedesktop.UPower
partir de par exemple/org/freedesktop/UPower
et imprime tous les chemins d'objet (noms de noeud):ce qui est à peu près ce que vous obtiendriez si vous l'utilisiez
d-feet
(pas que vous en auriez besoin):Bien sûr, vous pouvez facilement obtenir les chemins des objets via la ligne de commande, par exemple avec
gdbus
:Je n'ai pas
qdbus
installé mais selon cette pagedevrait produire un résultat similaire.
la source
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
?k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
. Je suppose que c'est possible en modifiant un peu la fonction.bus = dbus.SessionBus()..... obj_path = '/org/gnome/Gnote/RemoteControl'.......... cmd = 'qdbus org.gnome.Gnote'......... while obj_path not in ((subprocess.check_output(cmd, shell=True)).decode("utf-8")).split("\n"): ........pass
mylist=[]
puis remplacerprint
parmylist.append
et ensuite comme dernière commande dans ce bloc de fonctionreturn mylist
- c'est à peu près ce qu'il y a ... vous pouvez ensuite parcourir la liste ou quoi que ce soit, par exemple, ajouter au bas du scriptfor x in mylist: print("OBJ_PATH", x)
de les faire imprimer avec unOBJ_PATH
préfixe ...Je ne suis pas sûr que vous puissiez le faire par programme en Python. Vous pourriez, mais ce sera un énorme casse-tête pour comprendre comment. J'ai essayé de le faire avant et j'ai fini par détester Dbus. Quoi qu'il en soit, je recommande d'utiliser des pieds en D si vous voulez enquêter sur les choses. Voici une capture d'écran que j'ai volée sur mon blog .
Une fois que vous connaissez le nom du programme, le chemin de l'objet, etc., vous pouvez alors utiliser Python pour accéder à ces choses.
Exemple
Comme vous le voyez, c'est difficile de faire une chose simple. Mais c'est le flux de travail le plus simple que vous puissiez obtenir avec Dbus!
Utilisez donc un outil GUI pour trouver les chemins des objets, les interfaces, etc. Utilisez ensuite l'extrait de code ci-dessus comme modèle pour accéder à ces choses. Je vous suggère également de le faire via l'interpréteur d'IPython pour voir quelles méthodes, propriétés, etc. chaque objet a (en appuyant sur tab).
la source
Si le service a un objet implémenté
org.freedesktop.DBus.ObjectManager
, sa méthodeGetManagedObjects
renvoie «tous les objets, interfaces et propriétés dans un seul appel de méthode». Par exemple, UDisks2 a un tel objet.la source
Ce que je sais de mon expérience pour obtenir les chemins d'objet d'un nom de bus (service), il est possible d'introspecter le chemin d'objet '/' c'est-à-dire (en utilisant l'exemple ci-dessus)
cela devrait retourner:
puis introspect avec le chemin '/ org'
cela devrait retourner:
etc:
C'est comme parcourir la structure de dossiers du disque dur où le chemin de l'objet '/' est la racine et chaque nœud est un sous-dossier. Cela semble être le meilleur moyen de récupérer les chemins d'objet d'un nom de bus particulier (service) et de construire une collection contenant les chemins d'objet
la source
Selon les réponses de #don_crissti , j'ai implémenté, Cette solution donne à l'interface le nom et la méthode et signale les informations
la source