Ini adalah pertanyaan lanjutan untuk Daftar layanan DBus yang tersedia .
Kode python berikut akan mencantumkan semua layanan DBus yang tersedia.
import dbus
for service in dbus.SystemBus().list_names():
print(service)
Bagaimana cara membuat daftar jalur objek di bawah layanan dengan python? Tidak apa-apa jika jawabannya tidak melibatkan python meskipun lebih disukai.
Saya menggunakan Ubuntu 14.04
Jawaban:
Sesuai dokumen resmi (di bawah antarmuka standar ):
Jadi, inilah contoh yang sangat sederhana yang seharusnya membantu Anda memulai. Menggunakan
xml.etree.ElementTree
dandbus
:Itu introspeksi secara rekursif
org.freedesktop.UPower
mulai dari misalnya/org/freedesktop/UPower
dan mencetak semua jalur objek (nama node):yang cukup banyak apa yang akan Anda dapatkan jika Anda menggunakan
d-feet
(bukan bahwa Anda akan membutuhkannya):Tentu, Anda dapat dengan mudah mendapatkan path objek melalui command line misalnya dengan
gdbus
:Saya belum
qdbus
menginstal tetapi menurut halaman iniharus menghasilkan hasil yang serupa.
sumber
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
?k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
. Saya kira itu mungkin dengan memodifikasi fungsi sedikit.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=[]
kemudian gantiprint
denganmylist.append
dan kemudian sebagai perintah terakhir dalam blok fungsireturn mylist
- itu cukup banyak apa yang ada ... Anda kemudian dapat beralih di atas daftar atau apa pun misalnya tambahkan di bagian bawah skripfor x in mylist: print("OBJ_PATH", x)
agar mereka dicetak denganOBJ_PATH
awalan ...Saya tidak yakin Anda bisa melakukan ini secara terprogram dengan Python. Anda mungkin tetapi akan sangat sakit kepala untuk mengetahui caranya. Saya mencoba melakukannya sebelumnya dan akhirnya membenci Dbus. Bagaimanapun saya merekomendasikan untuk menggunakan d-feet jika Anda ingin menyelidiki sesuatu. Di bawah ini adalah tangkapan layar yang saya curi dari blog saya .
Setelah Anda mengetahui nama program, jalur objek, dll. Anda kemudian dapat menggunakan Python untuk mengakses hal-hal itu.
Contoh
Seperti yang Anda lihat, itu menyebalkan untuk menyelesaikan sesuatu yang sederhana. Tapi ini adalah alur kerja termudah yang bisa Anda dapatkan dengan Dbus!
Jadi gunakan alat GUI untuk mengetahui jalur objek, antarmuka, dll. Kemudian gunakan cuplikan kode di atas sebagai templat untuk mengakses hal-hal itu. Saya juga menyarankan Anda melakukan ini melalui penerjemah IPython untuk melihat metode, properti, dll. Apa yang dimiliki setiap objek (dengan menekan tab).
sumber
Jika layanan memiliki objek yang diimplementasikan
org.freedesktop.DBus.ObjectManager
, metodenyaGetManagedObjects
mengembalikan "semua objek, antarmuka, dan properti dalam panggilan metode tunggal." Misalnya, UDisks2 memiliki objek seperti itu.sumber
Apa yang saya tahu dari pengalaman saya untuk mendapatkan jalur objek dari nama bus (layanan) adalah mungkin untuk melakukan introspeksi dengan jalur objek '/' yaitu (menggunakan contoh di atas)
ini akan kembali:
lalu introspeksi dengan jalur '/ org'
ini akan kembali:
dan seterusnya:
Ini seperti pergi melalui struktur folder dari hard drive di mana path objek '/' adalah root dan setiap node adalah subfolder. Ini tampaknya cara terbaik untuk mengambil jalur objek dari nama bus tertentu (layanan) dan untuk membangun koleksi yang berisi jalur objek
sumber
Sesuai jawaban #don_crissti , saya menerapkan, solusi ini memberikan nama antarmuka dan metode dan sinyal informasi
sumber