Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 停止Avahi服务并返回元素列表_Python_Dbus_Avahi - Fatal编程技术网

Python 停止Avahi服务并返回元素列表

Python 停止Avahi服务并返回元素列表,python,dbus,avahi,Python,Dbus,Avahi,接下来,当我获取所有元素并将它们返回到列表中时,我想停止服务 停止无限循环就是调用gobject.MainLoop().quit(),但不知道何时何地调用。 谢谢当当前的最后一项服务到达时,您将希望停止浏览服务。这将为您提供当前可用服务的快照 C层中有一个标志,允许您检查是否有更多的服务即将提供。它现在被称为“AVAHI浏览器”。我不熟悉python绑定,但也许可以在回调的stype或flags参数中检查此标志 当您看到设置了此标志时-调用gobject.MainLoop().quit()您还需

接下来,当我获取所有元素并将它们返回到列表中时,我想停止服务

停止无限循环就是调用
gobject.MainLoop().quit()
,但不知道何时何地调用。 谢谢

当当前的最后一项服务到达时,您将希望停止浏览服务。这将为您提供当前可用服务的快照

C层中有一个标志,允许您检查是否有更多的服务即将提供。它现在被称为“AVAHI浏览器”。我不熟悉python绑定,但也许可以在回调的
stype
flags
参数中检查此标志


当您看到设置了此标志时-调用
gobject.MainLoop().quit()

您还需要监听AllForNow信号。也考虑失败和失败。声明了org.freedesktop.Avahi.ServiceBrowser的接口

在我的机器上运行以下命令大约一秒钟后返回并打印:

browsing ...
cache exhausted
New service: name = Lexmark X264dn; address = 10.9.0.93; port = 80
that's all for now
done
0:00:01.004258
希望有帮助


from _dbus_glib_bindings import DBusGMainLoop
import dbus, avahi
import gobject

class ServiceBrowser():
    def __init__(self, service):
        loop = DBusGMainLoop(set_as_default=True)

        bus = dbus.SystemBus(mainloop=loop)

        self._server = dbus.Interface(bus.get_object(avahi.DBUS_NAME, avahi.DBUS_PATH_SERVER), avahi.DBUS_INTERFACE_SERVER)

        browser = self._server.ServiceBrowserNew(avahi.IF_UNSPEC, avahi.PROTO_INET, service, '', 0)
        listener = dbus.Interface(bus.get_object(avahi.DBUS_NAME, browser), avahi.DBUS_INTERFACE_SERVICE_BROWSER)

        listener.connect_to_signal("ItemNew", self.item_new_handler)
        listener.connect_to_signal("ItemRemove", self.item_remove_handler)
        listener.connect_to_signal("AllForNow", self.all_for_now_handler)
        listener.connect_to_signal("CacheExhausted", self.cache_exhausted_handler)
        listener.connect_to_signal("Failure", self.failure_handler)

        self._mainloop = gobject.MainLoop()


    def service_resolved(self, *args):
        print 'New service: name = %s; address = %s; port = %s' % (args[2], args[7], args[8])


    def print_error(self, *args):
        print 'error_handler'
        print args[0]

    def item_new_handler(self, interface, protocol, name, stype, domain, flags):
        self._server.ResolveService(interface, protocol, name, stype, domain, avahi.PROTO_UNSPEC, dbus.UInt32(0), reply_handler=self.service_resolved, error_handler=self.print_error)


    def item_remove_handler(self, interface, protocol, name, stype, domain, flags):
        print "Removed service: %s" % name


    def all_for_now_handler(self):
        print "that's all for now"
        self._mainloop.quit()


    def cache_exhausted_handler(self):
        print "cache exhausted"


    def failure_handler(self, error):
        print "failure: %s" % error


    def browse(self):
        self._mainloop.run()


def browse_avahi(service):
    browser = ServiceBrowser(service)
    browser.browse()

def main():
    t0 = datetime.utcnow()
    print "browsing ..."
    browse_avahi('_http._tcp')
    print "done"
    print datetime.utcnow()-t0

if __name__ == '__main__':
    main()