Python 如何获取所有systemd1设备?
我写了下面的代码,试图检测特定设备是否通过USB连接。我想遍历连接的设备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')
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