[Python库] pyudev
-   pyudev是什么 pyudev是libudev的python版本,而libudev是linux的设备和硬件管理库。pyudev支持libudev的所有功能,可以通过官方提供的接口枚举设备、查找设备属性或者监听设备状态,包括异步监听。 资料: - pyudev github
- https://pyudev.readthedocs.io/en/latest/api/pyudev.html
 
-  如何枚举设备 from pyudev import Context context = Context() # 创建设备数据库连接对象 devices_list = context.list_devices() # 列出所有可用的设备,类型是pyudev.Enumerator 可迭代设备的对象 for device in devices_list:print(device) ---------------------------------- Device('/sys/devices/virtual/tty/tty48') Device('/sys/devices/virtual/tty/tty49') Device('/sys/devices/virtual/tty/tty5') Device('/sys/devices/virtual/tty/tty50') ...在 Context()中,默认定义了下面几个可以获取到设备的地址:- sys_path:/sys
- device_path:/dev
- run_path:/run
 
- 
-  如何查找设备 官方提供了几种查找设备的方法 -   from_path(*context,path*)根据设备路径查找设备 from pyudev import Context, Devices Device.from_path(context, '/devices/platform') --------------------------------- Device(u'/sys/devices/platform')
-   from_sys_path(*context,sys_path*)根据系统设备路径查找设备 from pyudev import Context, Devices Device.from_sys_path(context, '/sys//devices/platform') --------------------------------- Device(u'/sys/devices/platform')
-   from_name(*context,subsystem,sys_name*)根据设备标识符查找设备 from pyudev import Context, Devices context = Context() sda = Devices.from_name(context, 'block', 'sda') ------------------------------------------------ Device(u'/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda')
-   from_device_number(*context,typ,number*)根据设备号查找设备 from pyudev import Context, Devices context = Context() major, minor = 8, 0 device = Devices.from_device_number(context, 'block', os.makedev(major, minor)) ------------------------------- Device(u'/sys/devices/pci0000:00/0000:00:11.0/host0/target0:0:0/0:0:0:0/block/sda')
-   from_device_file(*context,filename*)根据设备文件查找设备 from pyudev import Context, Devices context = Context() device = Devices.from_device_file(context, '/dev/sda') ------------------------------ Device(u'/sys/devices/pci0000:00/0000:00:0d.0/host2/target2:0:0/2:0:0:0/block/sda')
 
-  
-  如何监听设备  pyudev提供了现成的监听接口,可以识别目前市面上所有类型的设备。context = Context() monitor = Monitor.from_netlink(context) monitor.filter_by(subsystem='block') for device in iter(monitor.poll, None):print('{0.action} on {0.device_path}'.format(device))上面代码块的意思是,当插入、拔出、挂载、卸载存储设备时,会输出设备的行为以及设备地址。 
-  获取到设备后获取设备属性 下面列出一部分属性,具体看文档。想更全面的获取设备属性,不但要去了解pyudev的用法,更要学习udev的底层知识。 Device 类 udev 中文手册 https://blog.csdn.net/u013253075/article/details/122703980 from pyudev import Context, Device, Devices context = Context() device = Devices.from_name(context, "block", "sda") print(device) print(f"device.get('ID_MODEL'): {device.get('ID_MODEL')}") print(f"device.context: {device.context}") print(f"device.sys_path: {device.sys_path}") print(f"device.sys_name: {device.sys_name}") print(f"device.sys_number: {device.sys_number}") print(f"device.device_path: {device.device_path}") print(f"device.device.tags: {list(device.tags)}") print(f"device.subsystem: {device.subsystem}") print(f"device.driver: {device.driver}") print(f"device.device_type: {device.device_type}") print(f"device.device_node: {device.device_node}") print(f"device.device_number: {device.device_number}") print(f"device.device_links: {device.device_links}") print(f"device.device_links: {device.device_links}") ------------------------------------- Device('/sys/devices/pci0000:00/0000:00:0d.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/block/sda') device.get('ID_MODEL'): Extreme_55AE device.context: <pyudev.core.Context object at 0x7ef3d978c310> device.sys_path: /sys/devices/pci0000:00/0000:00:0d.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/block/sda device.sys_name: sda device.sys_number: None device.device_path: /devices/pci0000:00/0000:00:0d.0/usb2/2-1/2-1:1.0/host0/target0:0:0/0:0:0:0/block/sda device.device.tags: ['systemd'] device.subsystem: block device.driver: None device.device_type: disk device.device_node: /dev/sda device.device_number: 2048 device.device_links: <generator object Device.device_links at 0x7ef3d96ff920>