To pytanie uzupełniające do Listy dostępnych usług DBus .
Poniższy kod python wyświetli listę wszystkich dostępnych usług DBus.
import dbus
for service in dbus.SystemBus().list_names():
print(service)
Jak wylistować ścieżki do obiektów w usługach w Pythonie? Jest ok, jeśli odpowiedź nie dotyczy Pythona, chociaż jest preferowana.
Używam Ubuntu 14.04
Odpowiedzi:
Zgodnie z oficjalnymi dokumentami (w standardowych interfejsach ):
Oto więc bardzo uproszczony przykład, który powinien zacząć. Wykorzystuje
xml.etree.ElementTree
idbus
:Rekurencyjnie introspektuje,
org.freedesktop.UPower
zaczynając od np./org/freedesktop/UPower
I drukuje wszystkie ścieżki obiektów (nazwy węzłów):co jest prawie tym, co byś otrzymał, gdybyś go użył
d-feet
(nie żebyś go potrzebował):Pewnie, możesz łatwo uzyskać ścieżki obiektu za pomocą wiersza poleceń, np. Za pomocą
gdbus
:Nie
qdbus
zainstalowałem, ale zgodnie z tą stronąpowinien dać podobny wynik.
źródło
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
?k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
. Podejrzewam, że jest to możliwe poprzez nieznaczne zmodyfikowanie funkcji.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=[]
następnie zastąpićprint
zmylist.append
czym jako ostatniego polecenia w tym blokureturn mylist
- to dość dużo, co jest ... można następnie iteracyjne nad listy lub cokolwiek np dodatku na dole skryptufor x in mylist: print("OBJ_PATH", x)
wydrukować je zOBJ_PATH
prefiksem ...Nie jestem pewien, czy możesz to zrobić programowo w Pythonie. Być może, ale wymyślenie tego będzie ogromnym bólem głowy. Próbowałem to zrobić wcześniej i ostatecznie nienawidziłem Dbus. W każdym razie polecam używać d-stóp, jeśli chcesz zbadać różne rzeczy. Poniżej zrzut ekranu, który ukradłem z mojego bloga .
Gdy znasz nazwę programu, ścieżkę obiektu itp., Możesz użyć Pythona, aby uzyskać dostęp do tych rzeczy.
Przykład
Jak widzisz, trudno jest zrobić prostą rzecz. Ale to najłatwiejszy przepływ pracy, jaki można uzyskać dzięki Dbus!
Więc użyj narzędzia GUI, aby znaleźć ścieżki obiektu, interfejsy itp. Następnie użyj powyższego fragmentu kodu jako szablonu, aby uzyskać dostęp do tych rzeczy. Sugeruję również, abyś zrobił to za pomocą interpretera IPython, aby zobaczyć, jakie metody, właściwości itp. Ma każdy obiekt (po wciśnięciu klawisza).
źródło
Jeśli usługa ma obiekt implementujący
org.freedesktop.DBus.ObjectManager
, jej metodaGetManagedObjects
zwraca „wszystkie obiekty, interfejsy i właściwości w jednym wywołaniu metody”. Na przykład UDisks2 ma taki obiekt.źródło
To, co wiem z mojego doświadczenia, aby uzyskać ścieżki obiektu nazwy magistrali (usługi), umożliwia introspekcję ze ścieżką obiektu „/” tj. (Używając powyższego przykładu)
to powinno zwrócić:
następnie introspekcja ze ścieżką „/ org”
to powinno zwrócić:
i tak dalej:
To jest jak przejście przez strukturę folderów na dysku twardym, gdzie ścieżka obiektu „/” jest katalogiem głównym, a każdy węzeł jest podfolderem. Wydaje się to najlepszym sposobem na pobranie ścieżek obiektów konkretnej nazwy magistrali (usługi) i zbudowanie kolekcji zawierającej ścieżki obiektów
źródło
Zgodnie z odpowiedziami #don_crissti , zaimplementowałem, To rozwiązanie podaje nazwę interfejsu oraz informacje o metodzie i sygnałach
źródło