Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.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 如何获取所有systemd1设备?_Python_Dbus_Freedesktop.org - Fatal编程技术网

Python 如何获取所有systemd1设备?

Python 如何获取所有systemd1设备?,python,dbus,freedesktop.org,Python,Dbus,Freedesktop.org,我写了下面的代码,试图检测特定设备是否通过USB连接。我想遍历连接的设备 def scanCameraInterfaces(self): ud_manager_obj = dbus.SystemBus().get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1') om = dbus.Interface(ud_manager_obj, 'org.freedesktop.systemd1.Unit')

我写了下面的代码,试图检测特定设备是否通过USB连接。我想遍历连接的设备

def scanCameraInterfaces(self):
    ud_manager_obj = dbus.SystemBus().get_object('org.freedesktop.systemd1', '/org/freedesktop/systemd1')
    om = dbus.Interface(ud_manager_obj, 'org.freedesktop.systemd1.Unit')

    try:
        for k, v in om.GetManagedObjects().items():
            print(k)
            print(v)
    except Exception:
        print("No devices found...")
但是,这将始终打印“未找到设备…”。因此,我删除了
try
,以便可以看到错误。它抛出以下内容:
dbus.exceptions.DbusException:org.freedesktop.dbus.Error.AccessDenied:拒绝发送消息,2条匹配规则:type=“method\u call”,sender=“:1.39”(uid=1000 pid=1009 comm=“python3 usbtest.py”)interface=“org.freedesktop.systemd1.Unit”member=“GetManagedObjects”Error name=“(unset)”请求\回复=“0”destination=“:1.1”(uid=0 pid=1 comm=“/sbin/init splash”)


我做错了什么?

您可以通过以下代码来完成:

import re
import subprocess
device_re = re.compile("Bus\s+(?P<bus>\d+)\s+Device\s+(?P<device>\d+).+ID\s(?P<id>\w+:\w+)\s(?P<tag>.+)$", re.I)
df = subprocess.check_output("lsusb")
devices = []
for i in df.split('\n'):
    if i:
        info = device_re.match(i)
        if info:
            dinfo = info.groupdict()
            dinfo['device'] = '/dev/bus/usb/%s/%s' % (dinfo.pop('bus'), dinfo.pop('device'))
            devices.append(dinfo)
print devices
如果您在windows中工作,可以尝试:

import win32com.client

wmi = win32com.client.GetObject ("winmgmts:")
for usb in wmi.InstancesOf ("Win32_USBHub"):
    print usb.DeviceID
我发现D-Bus绑定更容易使用

例如,要获取包含
*usb*
模式的所有单元的列表:

导入pydbus
systemd=pydbus.SystemBus().get('org.freedesktop.systemd1','/org/freedesktop/systemd1')
对于systemd.ListUnitsByPatterns([],['*usb*'])中的单元:
打印(单位[0])
要使用Python获取所有systemd1方法的列表,请执行以下操作:

  • dir(systemd)
在命令行上:

  • busctl introspect org.freedesktop.systemd1/org/freedesktop/systemd1
import win32com.client

wmi = win32com.client.GetObject ("winmgmts:")
for usb in wmi.InstancesOf ("Win32_USBHub"):
    print usb.DeviceID