【问题标题】:Python dbus get_object set timeoutPython dbus get_object 设置超时
【发布时间】:2018-04-07 05:50:45
【问题描述】:

代码:

def get_user_totp_status (user_name = ''):
    key_name = 'tfaEnable'

    try:
        bus = dbus.SystemBus()
    except:
        print "connect dbus error!"
        sys.exit(1)

    infopipe_obj = bus.get_object("org.freedesktop.sssd.infopipe", "/org/freedesktop/sssd/infopipe")
    ifp = dbus.Interface(infopipe_obj,dbus_interface='org.freedesktop.sssd.infopipe')
    print "get user totp status from dbus error!"

    result = ifp.GetUserAttr(user_name, [key_name])
    user_totp_status = 'True'
    if result:
        for status in result[key_name]:
            user_totp_status = status

    return user_totp_status

============
错误:
dbus.exceptions.DBusException: org.freedesktop.DBus.Error.TimedOut: org.freedesktop.sssd.infopipe 的激活超时

========

如果DBUS有问题,“get_object”需要很长时间。如何设置超时以缩短时间?

【问题讨论】:

    标签: python timeout dbus


    【解决方案1】:

    get_objectstart_service_by_name 都不支持超时。 作为一种解决方法,您可以像这样在get_object 之前直接使用call_blocking

    import dbus
    from _dbus_bindings import BUS_DAEMON_IFACE, BUS_DAEMON_NAME, BUS_DAEMON_PATH
    
    bus = dbus.SystemBus()
    
    timeout = 2
    flags = 0
    bus_name = "org.freedesktop.sssd.infopipe"
    
    try:
        bus.call_blocking(BUS_DAEMON_NAME, BUS_DAEMON_PATH,
                          BUS_DAEMON_IFACE,
                          'StartServiceByName',
                          'su', (bus_name, flags), timeout=timeout)
    
        infopipe_obj = bus.get_object("org.freedesktop.sssd.infopipe", "/org/freedesktop/sssd/infopipe")
    
    except dbus.exceptions.DBusException as e:
        print("The chosen bus is not available: %s", e)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-30
      • 2021-10-04
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多