Dies ist eine Folgefrage zu Eine Liste der verfügbaren DBus-Dienste .
Der folgende Python-Code listet alle verfügbaren DBus-Dienste auf.
import dbus
for service in dbus.SystemBus().list_names():
print(service)
Wie listen wir die Objektpfade unter den Diensten in Python auf? Es ist in Ordnung, wenn die Antwort kein Python enthält, obwohl dies bevorzugt wird.
Ich benutze Ubuntu 14.04
Antworten:
Gemäß den offiziellen Dokumenten (unter Standardschnittstellen ):
Hier ist ein sehr vereinfachtes Beispiel, das Ihnen den Einstieg erleichtern soll. Es verwendet
xml.etree.ElementTree
unddbus
:Es prüft rekursiv
org.freedesktop.UPower
ab zB/org/freedesktop/UPower
und gibt alle Objektpfade (Knotennamen) aus:Das ist so ziemlich das, was Sie bekommen würden, wenn Sie es benutzen würden
d-feet
(nicht, dass Sie es brauchen würden):Natürlich können Sie die Objektpfade einfach über die Befehlszeile abrufen, z. B .
gdbus
:Ich habe
qdbus
aber laut dieser Seite nicht installiertsollte ein ähnliches Ergebnis erzeugen.
quelle
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
?k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
. Ich nehme an, es ist möglich, indem man die Funktion ein wenig ändert.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=[]
dann ersetze sieprint
durchmylist.append
und dann als letzten Befehl in diesem Funktionsblockreturn mylist
- das ist so ziemlich das, was es gibt ... dann kannst du die Liste durchlaufen oder was auch immer, z. B. am Ende des Skripts hinzufügenfor x in mylist: print("OBJ_PATH", x)
um sie mit einemOBJ_PATH
Präfix drucken zu lassen ...Ich bin nicht sicher, ob Sie dies programmgesteuert in Python tun können. Sie könnten, aber es wird ein riesiger Kopfschmerz sein, um herauszufinden, wie. Ich habe es schon früher versucht und am Ende Dbus gehasst. Jedenfalls empfehle ich die Verwendung von D-Füßen, wenn Sie Dinge untersuchen möchten. Unten ist ein Screenshot, den ich aus meinem Blog gestohlen habe .
Sobald Sie den Programmnamen, den Objektpfad usw. kennen, können Sie mit Python auf diese Dinge zugreifen.
Beispiel
Wie Sie sehen, ist es eine Qual, eine einfache Sache zu erledigen. Dies ist jedoch der einfachste Workflow, den Sie mit Dbus erhalten können!
Verwenden Sie also ein GUI-Tool, um die Objektpfade, Schnittstellen usw. herauszufinden. Verwenden Sie dann den obigen Codeausschnitt als Vorlage, um auf diese Dinge zuzugreifen. Außerdem empfehle ich Ihnen, dies über den IPython-Interpreter zu tun, um zu sehen, welche Methoden, Eigenschaften usw. jedes Objekt hat (indem Sie auf die Registerkarte klicken).
quelle
Wenn der Dienst ein Objekt der Umsetzung hat
org.freedesktop.DBus.ObjectManager
, seine MethodeGetManagedObjects
zurückkehrt „alle Objekte, Schnittstellen und Eigenschaften in einem einzigen Methodenaufruf.“ Zum Beispiel hat UDisks2 ein solches Objekt.quelle
Was ich aus meiner Erfahrung weiß, um die Objektpfade eines Busnamens (Dienstes) zu erhalten, ist es möglich, den Objektpfad '/' (anhand des obigen Beispiels) zu überprüfen.
dies sollte zurückgeben:
dann Introspektion mit Pfad '/ org'
dies sollte zurückgeben:
und so weiter:
Es ist so, als würde man die Ordnerstruktur der Festplatte durchgehen, wobei der Objektpfad '/' der Stamm ist und jeder Knoten ein Unterordner ist. Dies scheint der beste Weg zu sein, um die Objektpfade eines bestimmten Busnamens (Dienstes) abzurufen und eine Sammlung mit den Objektpfaden zu erstellen
quelle
Wie pro #don_crissti Antworten, ich implementiert, gibt diese Lösung zu Schnittstellennamen und Verfahren und Signale Informationen
quelle