Esta é uma pergunta de acompanhamento para Uma lista de serviços DBus disponíveis .
O código python a seguir listará todos os serviços DBus disponíveis.
import dbus
for service in dbus.SystemBus().list_names():
print(service)
Como listamos os caminhos de objetos nos serviços em python? Tudo bem se a resposta não envolver python, embora seja preferido.
Estou usando o Ubuntu 14.04
Respostas:
Conforme os documentos oficiais (em interfaces padrão ):
Então, aqui está um exemplo muito simplista que deve ajudá-lo a começar. Usa
xml.etree.ElementTree
edbus
:Introspecta recursivamente a
org.freedesktop.UPower
partir de, por exemplo,/org/freedesktop/UPower
e imprime todos os caminhos de objetos (nomes de nós):que é praticamente o que você obteria se usasse
d-feet
(não que fosse necessário):Claro, você pode facilmente obter os caminhos dos objetos via linha de comando, por exemplo, com
gdbus
:Não tenho
qdbus
instalado, mas de acordo com esta páginadeve produzir um resultado semelhante.
fonte
rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
?k = rec_intro(bus, 'org.freedesktop.UPower', '/org/freedesktop/UPower')
. Suponho que seja possível modificando um pouco a função.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=[]
, substituaprint
pormylist.append
e, em seguida, como o último comando nesse bloco de funçõesreturn mylist
- é praticamente o que existe ... você pode iterar sobre a lista ou qualquer outra coisa, por exemplo, adicionar na parte inferior do scriptfor x in mylist: print("OBJ_PATH", x)
para tê-los impressos com umOBJ_PATH
prefixo ...Não tenho certeza se você pode fazer isso programaticamente em Python. Você pode, mas será uma enorme dor de cabeça para descobrir como. Eu tentei fazer isso antes e acabei odiando o Dbus. De qualquer forma, eu recomendo usar d-feet se você quiser investigar as coisas. Abaixo está uma captura de tela que eu roubei do meu blog .
Depois de saber o nome do programa, o caminho do objeto etc., você poderá usar o Python para acessar essas coisas.
Exemplo
Como você vê, é uma dor de cabeça fazer uma coisa simples. Mas este é o fluxo de trabalho mais fácil que você pode obter com o Dbus!
Portanto, use uma ferramenta da GUI para descobrir os caminhos do objeto, interfaces, etc. Em seguida, use o snippet de código acima como modelo para acessar essas coisas. Também sugiro que você faça isso através do intérprete do IPython para ver quais métodos, propriedades, etc. cada objeto possui (pressionando a guia).
fonte
Se o serviço tiver um objeto implementado
org.freedesktop.DBus.ObjectManager
, seu métodoGetManagedObjects
retornará "todos os objetos, interfaces e propriedades em uma única chamada de método". Por exemplo, o UDisks2 possui esse objeto.fonte
O que sei da minha experiência para obter os caminhos de objetos de um nome de barramento (serviço), é possível fazer uma introspecção com o caminho de objeto '/' ou seja, (usando o exemplo acima)
isso deve retornar:
em seguida, verifique com o caminho '/ org'
isso deve retornar:
e assim por diante:
É como passar pela estrutura de pastas do disco rígido, onde o caminho do objeto '/' é a raiz e todos os nós são subpastas. Essa parece a melhor maneira de recuperar os caminhos do objeto de um nome de barramento (serviço) específico e construir uma coleção que contém os caminhos do objeto
fonte
Conforme as respostas #don_crissti , implementei, esta solução fornece o nome da interface e o método e sinaliza informações
fonte