日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

dbus-python指南

發(fā)布時(shí)間:2023/12/10 python 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dbus-python指南 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

菜鳥學(xué)dbus-python,翻譯dbus-python指南,錯(cuò)誤之處請?jiān)谒y免,請諸位不吝賜教,多多指正!查看英文原版請點(diǎn)這里。

  • 連接總線Connecting to the Bus
  • 方法調(diào)用Making method calls
    • 代理對象proxy objects
    • 接口和方法Interfaces and methods
      • See also
    • 數(shù)據(jù)類型Data types
      • 基本類型Basic types
      • 基本類型轉(zhuǎn)換Basic types conversions
      • 容器類型Container types
      • 返回值和byte_arrays和utf8_strings選項(xiàng)
  • 異步方法調(diào)用Making asynchronous method calls
    • 設(shè)置一個(gè)事件循環(huán)Setting up an event loop
      • 向后兼容dbusglib
      • Qt主循環(huán)
    • 異步調(diào)用Making asynchronous calls
      • See also
  • 接收信號Receiving signals
    • 信號匹配Signal matching
    • 從一個(gè)信號獲取更多信息Getting more information from a signal
    • 字符串參數(shù)匹配String argument matching
    • 從代理對象接收信號Receiving signals from a proxy object
    • See also
  • Exporting 對象Exporting objects
    • 從dbusservicesObject繼承
    • 使用dbusservicemethod Exporting方法Exporting methods with dbusservicemethod
      • 找出調(diào)用者的bus nameFinding out the callers bus name
      • 異步方法實(shí)現(xiàn)Asynchronous method implementations
    • 使用dbusservicesignal發(fā)送信號Emitting signals with dbusservicesignal
      • 例子Example
  • Licence for this document

連接總線(Connecting to the Bus)

使用D-Bus的應(yīng)用程序通常都會連接到一個(gè)總線服務(wù)(bus daemon)上,這個(gè)總線服務(wù)在程序之間傳遞消息。為了使用D-Bus,你需要創(chuàng)建一個(gè)Bus對象來代表到總線服務(wù)的連接。
一般來說,我們感興趣的總線(bus)服務(wù)有2種:會話總線和系統(tǒng)總線。

每個(gè)登陸的用戶所屬的會話都應(yīng)該有一個(gè)會話總線(session bus),會話總線只在本會話內(nèi)有效。它用于桌面程序間的通信。可以通過創(chuàng)建一個(gè)SessionBus的對象連接到會話總線:

import dbus session_bus = dbus.SessionBus()

系統(tǒng)總線是全局的,通常在系統(tǒng)啟動的時(shí)候就被加載了;它用于與系統(tǒng)服務(wù)通信,例如udev, NetworkManager和Hardware Abstraction Layer daemon(hald)。可以通過創(chuàng)建一個(gè)SystemBus對象來連接到系統(tǒng)總線。

import dbus system_bus = dbus.SystemBus()

當(dāng)然,你可以在程序里兩個(gè)總線都連接。
在一些特殊的情況下,你可能不使用默認(rèn)的總線(Bus),或者根本就不連接到總線上,這些可以通過dbus-python 0.81.0中新添加的API來實(shí)現(xiàn)。但是這里不做介紹,他們是別的指南中的一個(gè)主題。

方法調(diào)用(Making method calls)

D-Bus應(yīng)用程序可以export對象給其他應(yīng)用程序使用。為了使用其他應(yīng)用程序提供的對象,你需要知道:

  • 總線名(bus name)。總線名用來標(biāo)識你想與哪個(gè)應(yīng)用程序通信。我們通常使用一個(gè)眾所周知的名字(well-known name)來識別一個(gè)程序。這個(gè)眾所周知的名字是一個(gè)反域名的點(diǎn)分式字符串,例如org.freedesktop.NetworkManager或者com.example.WordProcessor。
  • 對象路徑(object path)。應(yīng)用程序可以export很多對象。例如example.com的文檔處理程序可能提供一個(gè)對象代表文檔處理程序自身,并且為每個(gè)打開的文檔窗口創(chuàng)建一個(gè)對象,還可能為文檔中的每一個(gè)段落創(chuàng)建一個(gè)對象。
    為了標(biāo)識要與哪一個(gè)對象通信,你可以使用對象路徑來指定。對象路徑是一個(gè)由反斜線作為分隔的字符串,類似Linux系統(tǒng)下的文件名。例如,example.com的文檔處理程序可能提供一個(gè)對象路徑為/的對象代表程序自身,還可能提供對象路徑為/documents/123和/documents/345的對象代表打開的文檔窗口。
    正如你所期望的那樣,你對遠(yuǎn)端對象做的最主要的事情就是調(diào)用它們的方法。在Python中,方法可以有參數(shù),同時(shí)它們可能返回一個(gè)或更多的返回值。

    代理對象(proxy objects)

    為了與一個(gè)遠(yuǎn)端的對象通信,我們使用代理對象。代理對象是一個(gè)Python對象,它是遠(yuǎn)端對象的一個(gè)代理或替身-當(dāng)調(diào)用代理對象的一個(gè)方法時(shí),會導(dǎo)致dbus-python對遠(yuǎn)端對象的方法調(diào)用,并將遠(yuǎn)端對象的返回值作為代理對象方法調(diào)用的返回值。
    可以對Bus調(diào)用get_object方法來獲取代理對象。例如,NetworkManager有一個(gè)眾所周知的名稱org.freedesktop.NetworkManager, NetworkManager export一個(gè)對象路徑為/org/freedesktop/NetworkManager的對象。NetworkManager為每一個(gè)網(wǎng)絡(luò)接口(network interface)都在對象路徑下創(chuàng)建一個(gè)對象,例如,/org/freedesktop/NetworkManager/Devices/eth0。你可以像這樣獲取一個(gè)代理對象來代理eth0:

    import dbus bus = dbus.SystemBus() proxy = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager/Devices/eth0')#proxy 是一個(gè)dbus.proxies.ProxyObject類型的對象

    接口和方法(Interfaces and methods)

    D-Bus使用接口(interfaces)給方法(methods)提供命名空間的機(jī)制。一個(gè)接口(interface)就是一組相關(guān)的方法和信號(后面再介紹信號),接口名字是一個(gè)反域名的點(diǎn)分式字符串。例如,每一個(gè)代表一個(gè)網(wǎng)絡(luò)接口的NetworkManager對象都實(shí)現(xiàn)了接口org.freedesktop.NetworkManager.Devices,在這個(gè)接口中有一個(gè)方法是gerProperties。
    要調(diào)用一個(gè)方法,就在代理對象上調(diào)用相同的方法,并通過dbus_interface關(guān)鍵字參數(shù)將接口名傳入:

    import dbus bus = dbus.SystemBus() eth0 = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager/Devices/eth0') props = eth0.getProperties(dbus_interface='org.freedesktop.NetworkManager.Devices')#props 是一個(gè)屬性元組,元組的第一項(xiàng)是對象路徑。

    簡便起見,如果你要在同一個(gè)接口上調(diào)用多個(gè)方法時(shí),可以先構(gòu)造一個(gè)dbus.Interface的對象,通過這個(gè)對象調(diào)用方法,這樣就可以避免每次調(diào)用方法都要傳入接口名的麻煩:

    import dbus bus = dbus.SystemBus() eth0 = bus.get_object('org.freedesktop.NetworkManager', '/org/freedesktop/NetworkManager/Devices/eth0') eth0_dev_iface = dbus.Interface(eth0, dbus_interface='org.freedesktop.NetworkManager.Devices') props = dbus_dev_iface.getProperties()#props 同樣是一個(gè)屬性元組,元組的第一項(xiàng)是對象路徑。

See also

可以參考examples/example-client.py中的例子。在運(yùn)行它之前,你需要在后臺或者另一個(gè)shell上運(yùn)行examples/example-service.py

數(shù)據(jù)類型(Data types)

與Python不同,D-Bus使用靜態(tài)類型-每個(gè)方法都有一個(gè)標(biāo)識來代表其參數(shù)的類型,其他類型的參數(shù)是不被接受的。
D-Bus有一個(gè)內(nèi)省機(jī)制(introspection mechanism),dbus-python通過這個(gè)機(jī)制來嘗試發(fā)現(xiàn)正確的參數(shù)類型。如果嘗試成功,Python類型會被自動轉(zhuǎn)化為正確的D-Bus數(shù)據(jù)類型,如果可以;如果類型不恰當(dāng),會報(bào)TypeError錯(cuò)誤。
如果內(nèi)省失敗(或者參數(shù)類型可變-詳見下文),你必須提供正確的參數(shù)類型。dbus-python根據(jù)D-Bus的數(shù)據(jù)類型提供了相應(yīng)的Python類型,一些Python類型可以自動的轉(zhuǎn)化為D-Bus數(shù)據(jù)類型。如果你使用這些類型之外的類型時(shí),會TypError出錯(cuò),提示你dbus-python不能猜出D-Bus的標(biāo)識。

基本類型(Basic types)

以下是支持的基本數(shù)據(jù)類型。

Python typesconverted to D-Bus tyepnotes
D-Bus proxy objectObjectPath(signature’o’)(+)
dbus.InterfaceObjectPath(signature’o’)(+)
dbus.service.service.ObjectObjectPath(signature’o’)(+)
dbus.BooleanBoolean(signature’b’)a subclass of int
dbus.Bytebyte(signature’y’)a subclass of int
dbus.Int1616-bit signed integer(‘n’)a subclass of int
dbus.Int3232-bit signed integer(‘i’)a subclass of int
dbus.Int6464-bit signed integer(‘x’)(*)
dbus.UInt1616-bit unsigned integer(‘q’)a subclass of int
dbus.UInt3232-bit unsigned integer(‘u’)(*)_
dbus.UInt6464-bit unsigned integer(‘t’)(*)_
dbus.Doubledouble-precision float(‘d’)a subclass of float
dbus.ObjectPathobject path(‘o’)a subclass of str
dbus.Signaturesignature(‘g’)a subclass of str
dbus.Stringstring(’s’)a subclass of unicode
dbus.UTF8Stringstring(’s’)a subclass of str
boolBoolean(‘b’)
int or subclass32-bit signed integer(‘i’)
long or subclass64-bit signed integer(‘x’)
float or subclassdouble-precision float(‘d’)
str or subclassstring(’s’)must be valid UTF-8
unicode or subclassstring(’s’)

標(biāo)記(*)的類型,在不同的平臺上可能是int的子類或者long的子類。
(+):D-Bus proxy objects, exported D-Bus service objects 以及其他任何擁有dbus_object_path屬性(必須為字符串,可以轉(zhuǎn)化為對象路徑)的對象。這在你使用dbus-python編寫面向?qū)ο蟮腁PI時(shí),可能對你有幫助。

基本類型轉(zhuǎn)換(Basic types conversions)

如果內(nèi)省成功,dbus-python還接受:

  • 對于Boolean參數(shù),任何對象(經(jīng)由int(bool(…))轉(zhuǎn)化)
  • 對于byte參數(shù),a single-character string,即,單字字符串(經(jīng)由ord()轉(zhuǎn)化)
  • 對于byte和integer參數(shù),任何integer(必須在正確的區(qū)間)
  • 對于object-path和signature參數(shù),任何str或者unicode的子類(值必須遵循正確的語法)。

容器類型(Container types)

D-Bus支持4種容器類型:array(包含同種類型數(shù)據(jù)的可變長度隊(duì)列), struct(一個(gè)固定長度隊(duì)列,它的成員可能是不同的數(shù)據(jù)類型),dictionary(從同一基本類型到同一類型的映射),variant(一種可以存儲任何D-Bus數(shù)據(jù)類型的容器,包含另一variant在內(nèi))。

Array的代表是Python的list或者dbus.Array(list的一個(gè)子類)。發(fā)送一個(gè)array時(shí),如果內(nèi)省標(biāo)識(introspected signature)可用,則使用內(nèi)省標(biāo)識;否則,如果傳遞了signature關(guān)鍵字參數(shù)給array的構(gòu)造函數(shù),則使用傳遞的signature來作為array內(nèi)容的signature;如果內(nèi)省失敗,也沒有給array的構(gòu)造函數(shù)傳遞signature關(guān)鍵字參數(shù),則dbus-python將根據(jù)array的第一個(gè)元素來猜測其signature.

一個(gè)array的signature格式為’ax’,其中的’x’代表array元素的signature。例如,你可以用’as’表示字符串a(chǎn)rray(array of strings),或者用’a(ii)’表示結(jié)構(gòu)體數(shù)組(array of structs each containing two 32-bit integer),這個(gè)array的元素是有2個(gè)32-bit整數(shù)組成的結(jié)構(gòu)體。

還有一種類型dbus.ByteArray,它是str的一個(gè)子類。這種類型被廣泛用于代表一個(gè)D-Bus的字節(jié)數(shù)組(signature ‘a(chǎn)y’)。

Struct的代表是Python的tuple或者dbus.Struct(tuple的一個(gè)子類)。當(dāng)發(fā)送一個(gè)struct時(shí),如果內(nèi)省的signature可用,則使用內(nèi)省的signature;否則,如果傳遞signature關(guān)鍵字參數(shù)給Struct(指南中使用的的Array,個(gè)人感覺是寫錯(cuò)了,不是是否理解有誤)的構(gòu)造函數(shù),則使用此傳遞的signature作為struct內(nèi)容的signature;否則dbus-python將通過struct(同樣,指南原文使用的是Array)的第一個(gè)元素來猜測signature(這里個(gè)人有一點(diǎn)小疑問,struct的成員數(shù)據(jù)類型是不一定相同的,這個(gè)要怎么根據(jù)第一個(gè)元素猜?)。

一個(gè)struct的signature是用一個(gè)元括號將其成員的signature括起來。例如’(is)’是一個(gè)struct的signature,這個(gè)struct包含了一個(gè)32-bit的integer成員和一個(gè)string類型成員。

Dictionary的代表是Python的Dictionary或者dbus.Dictionary(一個(gè)dict的子類)。當(dāng)發(fā)送一個(gè)dictionary時(shí),如果內(nèi)省的signature可用,則使用內(nèi)省signature;否則,如果給Dictionary的構(gòu)造函數(shù)傳遞了signature關(guān)鍵字參數(shù),則使用傳遞的signature作為dictionary內(nèi)部的key和value的signature;否則,dbus-python會根據(jù)dict中隨意的一個(gè)item來猜測其signature。

dictionary的signature的格式為’a{xy}’,其中,’x’是dictionary中key的signature(它不能是容器的類型),’y‘是dictionary中的value的signature。例如,’a{s(ii)}’是一個(gè)dictionary的signature,這個(gè)dictionary的key是一個(gè)字符串,value是一個(gè)由2個(gè)32-bit的整數(shù)組成的結(jié)構(gòu)體。

variant的代表是在D-Bus的任意一個(gè)數(shù)據(jù)類型上,通過其構(gòu)造函數(shù)將關(guān)鍵字參數(shù)variant_level的值設(shè)置為一個(gè)大于0的數(shù)。(variant_level 1表示一個(gè)包含一些其他數(shù)據(jù)類型(不能是variant類型)的成員variant。variant_level 2 表示一個(gè)包含另一個(gè)variant(被包含的variant是一個(gè)包含除了variant類型之外的其他數(shù)據(jù)成員的variant)成員的variant,等等)。如果將一個(gè)非variant(non-variant)數(shù)據(jù)傳遞給一個(gè)內(nèi)省要求為variant的參數(shù),則,這個(gè)非variant數(shù)據(jù)會被自動封裝為variant類型。

variant的signature是’v’。

返回值和byte_arrays和utf8_strings選項(xiàng)

如果一個(gè)D-Bus方法沒有返回值,則Python的代理方法返回None。

如果一個(gè)D-Bus方法有一個(gè)返回值,則Python代理方法會根據(jù)dbus.Types的相應(yīng)類型返回那個(gè)數(shù)值-默認(rèn)情況下,如果方法返回dbus.String(Unicode的一個(gè)子類)類型,則代理方法返回string。如果方法返回值是由dbus.Byte組成的dbus.Array,則Python代理方法返回array。

如果一個(gè)D-Bus方法返回多個(gè)返回值,則Python代理方法返回一個(gè)包含這些數(shù)值的tuple。

如果你想讓返回的string類型是dbus.UTF8String(str的一個(gè)子類),需要給python的代理方法傳遞關(guān)鍵字參數(shù)utf8_string=True。

如果你想讓byte array數(shù)值以dbus.ByteArray(同樣也是str的子類,在實(shí)踐中,這個(gè)類型經(jīng)常是你最需要的)的類型返回,需要給python代理方法傳遞關(guān)鍵字參數(shù)byte_arrays=True。

異步方法調(diào)用(Making asynchronous method calls)

異步(非阻塞)方法調(diào)用允許多個(gè)方法調(diào)用同時(shí)進(jìn)行,并且允許你在等待返回結(jié)果之前做其他事情。要使用異步方法調(diào)用,你首先需要一個(gè)事件循環(huán)或者“主循環(huán)”(main loop)。

設(shè)置一個(gè)事件循環(huán)(Setting up an event loop)

當(dāng)前,dbus-python唯一支持的主循環(huán)(main loop)就是GLib。
dbus-python有一個(gè)全局默認(rèn)的主循環(huán),這是使用這個(gè)功能的最簡便方法。要把GLib設(shè)置為默認(rèn)主循環(huán)可以通過:

from dbus.mainloop.glib import DBusGMainLoop DBusGMainLoop(set_as_default=True)

這些操作必須要在連接到bus服務(wù)之前完成。
可以通過pygi開始運(yùn)行主循環(huán):

from gi.repository import GLib loop = GLib.MainLoop() loop.run()

當(dāng)loop.run()正在執(zhí)行時(shí),GLib會在適當(dāng)?shù)臅r(shí)候調(diào)用你的回調(diào)函數(shù)。要停止事件循環(huán),調(diào)用loop.quit()。
你也可以通過在連接Bus服務(wù)時(shí),通過傳遞一個(gè)main loop給Bus的構(gòu)造函數(shù),這樣也可以設(shè)置主循環(huán):

import dbus from dbus.mainloop.glib import DBusGMainLoop dbus_loop = DBusGMainLoop() bus = dbus.SessionBus(mainloop=dbus_loop)

這個(gè)功能不是很有用,除非我們能夠支持多個(gè)主循環(huán)。

向后兼容:dbus.glib

在dbus-python 0.80以前的版本, 設(shè)置GLib作為默認(rèn)主循環(huán)的方式是:

import dbus.glib

執(zhí)行以上import語句會自動加載GLib的主循環(huán)并將其作為默認(rèn)設(shè)置。這中做法由于太不明顯已經(jīng)被拋棄。但是知道這個(gè)事情對你要編寫或者理解以前版本的代碼還是有用的。

Qt主循環(huán)

PyQt V4.2和其以后版本支持將dbus-python整合到Qt事件循環(huán)中。要把D-Bus連接到Qt的主循環(huán)中,掉用dbus.mainloop.qt.DBusQtMainLoop
代替dbus.mainloop.glib.DBusGMainLoop即可。除此以外,Qt循環(huán)和GLib循環(huán)的使用方式一樣。

異步調(diào)用(Making asynchronous calls)

要做異步調(diào)用,需要傳遞2個(gè)可調(diào)用的關(guān)鍵字參數(shù)reply_handler和error_handler給代理方法(代理對象的方法)。代理方法會理解返回None。一段時(shí)間以后,在事件循環(huán)的運(yùn)行過程中,會發(fā)生以下兩種情況之一:

  • reply_handler以method的返回值作為參數(shù)被調(diào)用;或者
  • error_handler以一個(gè)代表遠(yuǎn)端異常的DBusException實(shí)例為參數(shù)被調(diào)用。

See also

examples/example-async-client.py異步調(diào)用了examples/example-service.py提供的服務(wù),這些服務(wù)會返回一個(gè)值或者異常。與examples/example-client.py一樣,你也需要先在后臺或者另一個(gè)shell運(yùn)行examples/example-service.py。

接收信號(Receiving signals)

要接收信號,Bus需要連接到一個(gè)事件循環(huán)上。只有當(dāng)事件循環(huán)運(yùn)行時(shí),信號才能被接收。

信號匹配(Signal matching)

要響應(yīng)信號,你可以在Bus對象上使用add_signal_receiver方法。當(dāng)接收到匹配的信號后,會調(diào)用安排好的回調(diào)函數(shù)。add_signal_receiver有以下參數(shù):

  • a callable(the handler_function),當(dāng)接收到信號時(shí)會調(diào)用這個(gè)函數(shù),它的參數(shù)將作為信號的參數(shù)。
  • 信號名,signal_name:默認(rèn)為None,匹配所有名字
  • D-Bus接口,dbus_interface:默認(rèn)為None,匹配所有接口
  • 發(fā)送端的眾所周知名或唯一名,bus_name:默認(rèn)None,匹配所有發(fā)送者。眾所周知名匹配當(dāng)前這個(gè)周知名的擁有者。
  • 發(fā)送端的對象路徑,path:默認(rèn)為None,匹配所有對象路徑。
    add_signal_receiver 也有兩個(gè)關(guān)鍵字參數(shù)utf8_strings和byte_arrays,它們會影響調(diào)用handler函數(shù)時(shí)使用的數(shù)據(jù)類型。它們對于代理對象也會產(chǎn)生同樣的影響。
    add_signal_receiver返回一個(gè)SignalMatch對象,這個(gè)對象唯一有用的公共API是無參數(shù)的remove方法,調(diào)用這個(gè)方法會從連接中刪除信號的匹配。

從一個(gè)信號獲取更多信息(Getting more information from a signal)

你也可以安排更多的信息傳遞給handler函數(shù)。如果你傳遞關(guān)鍵字參數(shù)sender_keyword, destination_keyword, interface_keyword, member_keyword或者path_keyword給connect_to_signal方法,則信號的相應(yīng)部分的信息會作為關(guān)鍵字參數(shù)傳遞給handler函數(shù)。例如:

def handler(sender=None):print "got signal from %r" % sender iface.connect_to_signal("Hello", handler, sender_keyword='sender')

當(dāng)接收到來自com.example.Foo的無參數(shù)信號Hello時(shí),handler函數(shù)會被調(diào)用,并且以sender=’com.example.Foo’為參數(shù)。

字符串參數(shù)匹配(String argument matching)

如果關(guān)鍵字參數(shù)的格式是argN,N是一個(gè)小的非負(fù)數(shù),并且它們的值必須是unicode或UTF-8格式的字符串。此時(shí),只有當(dāng)接收到的信號的參數(shù)是這個(gè)關(guān)鍵字參數(shù)字符串時(shí),才會調(diào)用handler函數(shù)。

從代理對象接收信號(Receiving signals from a proxy object)

代理對象有一個(gè)特殊的connect_to_signal方法,它安排一個(gè)可調(diào)用函數(shù),當(dāng)代理對象接收到來自其對應(yīng)的遠(yuǎn)端的信號時(shí),就會調(diào)用這個(gè)可調(diào)用函數(shù)。代理對象的connect_to_signal的參數(shù)有:

  • 信號名稱。
  • 一個(gè)可調(diào)用函數(shù)(the handler function),當(dāng)接收到信號時(shí)被事件循環(huán)調(diào)用-它的參數(shù)將作為信號的參數(shù)。
  • handler函數(shù),一個(gè)可調(diào)用函數(shù):與add_signal_receiver一樣
  • 關(guān)鍵字參數(shù) dbus_interface,指定接口名稱。
    dbus.Interface對象也有一個(gè)類似的connect_to_signal方法,但是它不再需要關(guān)鍵字參數(shù)dbus_interface,因?yàn)榻涌诿畔⒁呀?jīng)知道了。

盡管可以你可以創(chuàng)建代理對象并啟用監(jiān)聽信號的服務(wù),但是我們不應(yīng)該僅僅為了監(jiān)聽信號就專門創(chuàng)建代理對象,如果你已經(jīng)創(chuàng)建了一個(gè)代理對象用于方法調(diào)用,那么你也可以很方便的用它來匹配信號。

See also

examples/signal-recipient.py接收信號-它示范了常用信號的匹配以及connect_to_signal的使用。在運(yùn)行這個(gè)腳本之前,你需要在后臺或者另一個(gè)shell里運(yùn)行examples/signal-emitter.py。

Exporting 對象(Exporting objects)

對象被exported后可以很方便的讓其他程序通過D-Bus定位到。所有dbus.service.Object的子類都會自動被exported。
要export對象,Bus需要連接到一個(gè)事件循環(huán)。只有在事件循環(huán)運(yùn)行時(shí),export方法才會被調(diào)用,隊(duì)列中的信號才會被發(fā)送。

從dbus.services.Object繼承

要把一個(gè)對象export到Bus上,只要子類化dbus.service.Object就可以了。需要將一個(gè)BusName/Bus object,以及對象路徑傳遞給對象的構(gòu)造函數(shù)。例如:

class Example(dbus.service.Object):def __init__(self, object_path):dbus.service.Object.__init__(self, dbus.SessionBus(), path)

這個(gè)對象會自動支持introspection, 但是沒有其它任何有用的功能。要完善它,我們需要export一些方法和信號。

使用dbus.service.method Exporting方法(Exporting methods with dbus.service.method)

可以使用dbus.service.method裝飾器(python用于修飾函數(shù))來export一個(gè)方法。例如:

class Example(dbus.service.Object):def __init__(self, object_path):dbus.service.Object.__init__(self, dbus.SessionBus(), path)@dbus.service.method(dbus_interface='com.example.Sample', in_signature='v', out_signature='s')def StringifyVariant(self, variant):return str(variant)

in_signature和out_signature是D-Bus的標(biāo)識字符串,在數(shù)據(jù)類型章節(jié)介紹了。
你也可以傳遞關(guān)鍵字參數(shù)byte_arrays和utf8_strings,這會影響到在D-Bus調(diào)用裝飾方法時(shí),傳遞給裝飾方法的參數(shù)的類型。這兩個(gè)關(guān)鍵字參數(shù)也對代理方法的返回值產(chǎn)生同樣的影響。

找出調(diào)用者的bus name(Finding out the caller’s bus name)

裝飾方法接受sender_keyword關(guān)鍵字參數(shù)。如果你把這個(gè)關(guān)鍵字參數(shù)設(shè)置為一個(gè)字符串,則發(fā)送者的唯一名會被作為那個(gè)名字的關(guān)鍵字參數(shù)傳遞給裝飾方法:

class Example(dbus.service.Object):def __init__(self, object_path):dbus.service.Object.__init__(self, dbus.SessionBus(), path)@dbus.service.method(dbus_interface='com.example.Sample', in_signature='', out_signature='s', sender_keyword='sender')def SayHello(self, sender=None):return 'Hello, %s!' % sender# ->something like 'Hello, :1.1!'

異步方法實(shí)現(xiàn)(Asynchronous method implementations)

例子參考examples/example-async-service.py。(這個(gè)例子服務(wù)器上還沒有)

使用dbus.service.signal發(fā)送信號(Emitting signals with dbus.service.signal)

要export一個(gè)信號,可以使用裝飾符dbus.service.signal;要發(fā)送那個(gè)信號,調(diào)用裝飾方法。通常,裝飾方法也可以包含調(diào)用時(shí)運(yùn)行的代碼(不太理解,感覺是廢話),例如:

class Example(dbus.service.Object):def __init__(self, object_path):dbus.service.Object.__init__(self, dbus.SessionBus(), path)@dbus.service.signal(dbus_interface='com.example.Sample', signature='us')def NumberOfBottlesChanged(self, number, content):print "%d bottles of %s on the wall" % (number, content)e = Example('/bottle-counter') e.NumberOfBottlesChanged(100, 'beer') # -> emits com.example.Sample.NumberOfBottlesChanged(100, 'beer') # and prints "100 bottles of beer on the wall"

例子(Example)

當(dāng)examples/example-signal-emitter.py的某個(gè)方法被調(diào)用時(shí),它會根據(jù)需要發(fā)送一些信號。(事實(shí)上,當(dāng)一些內(nèi)部狀態(tài)發(fā)生變化時(shí)你會發(fā)送一個(gè)信號。這些狀態(tài)的變化可能是D-Bus的方法調(diào)用引起的也可能不是由由D-Bus的方法調(diào)用引起的。)

Licence for this document

總結(jié)

以上是生活随笔為你收集整理的dbus-python指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。