如何为两个单独的 Dbus Python 程序创建 Dbus Mainloop

Posted

技术标签:

【中文标题】如何为两个单独的 Dbus Python 程序创建 Dbus Mainloop【英文标题】:How to create for Dbus Mainloop for two separate Dbus Python programs 【发布时间】:2020-11-10 09:01:44 【问题描述】:

我有一个监控 Dbus 服务 (NetworkManager) 并与之交互的 python 进程

目前它在主程序的自己的线程中运行

import dbus.mainloop.glib
import NetworkManager

PYTHON3 = sys.version_info >= (3, 0)
if PYTHON3:
    from gi.repository import GObject as gobject
    from gi.repository import GLib as glib
else:
    import gobject

class NetworkController(threading.Thread):

    def __init__(self, run_daemon_mode=False):
        # Set up DBus loop
        self.loop = None
        dbus.mainloop.glib.threads_init()
        dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
        
        if PYTHON3:
            self.loop = glib.MainLoop()
        else:
            self.loop = gobject.MainLoop()
            gobject.threads_init()

        #Create the thread
        super(NetworkController, self).__init__(daemon=run_daemon_mode)

    def run(self):
        """
        Method to run the DBus main loop (on a thread)
        """

        # NetworkManager init stuff...
        
        logger.debug("Starting Network Controller loop.")
        self.loop.run()
        logger.debug("Network Controller loop has exited.")

def main(argv):
    
    args=cli(argv) 

    #create network controller object but don't start the thread
    network_con = network_controller.NetworkController(True)
    network_con.start()     #

    try:
        while True:


我现在需要添加一个线程来控制我的蓝牙 GATT 服务(pyBluez 实现),该服务也使用 Dbus。如何构建我的代码以让每个进程在它自己的线程中运行并使用 Dbus。

谢谢!

【问题讨论】:

【参考方案1】:

我创建了我的新类,它使用 Dbus 并且是一个单独的线程,就像我创建我的第一个类一样。然后从我的主程序中调用类构造函数并启动每个线程。

class AnotherGlibMainloop(threading.Thread):

def __init__(self, run_daemon_mode=False):
    # Set up DBus loop
    self.loop = None
    dbus.mainloop.glib.threads_init()
    dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
    
    if PYTHON3:
        self.loop = glib.MainLoop()
    else:
        self.loop = gobject.MainLoop()
        gobject.threads_init()

    #Create the thread
    super(NetworkController, self).__init__(daemon=run_daemon_mode)

def run(self):
    """
    Method to run the DBus main loop (on a thread)
    """

    # NetworkManager init stuff...
    
    logger.debug("Starting Another Glib Mainloop.")
    self.loop.run()
    logger.debug("Another Glib Mainloop has exited.")

def main(argv):    args=cli(argv) 

#create network controller object but don't start the thread
network_con = network_controller.NetworkController(True)
network_con.start()     #

another_glib_mainloop = AnotherGlibMainloop(True)
another_glib_mainloop.start()

try:
    while True:

【讨论】:

以上是关于如何为两个单独的 Dbus Python 程序创建 Dbus Mainloop的主要内容,如果未能解决你的问题,请参考以下文章

如何为每种风格生成单独的签名APK?

如何为两个单独的 CreateProcess() API 调用打开单独的命令提示符控制台

Spring Security OAuth2:如何为两类用户提供两个单独的登录链接?

在 Angular 项目中,如何为项目单独创建路由文件?

如何为 icarousel 中的每个按钮创建单独的操作?

如何为多对多关系创建 UI?