[Python库] pyudev

[Python库] pyudev

  1. pyudev​是什么

    pyudev​是libudev​的python版本,而libudev​是linux的设备和硬件管理库。

    pyudev支持libudev的所有功能,可以通过官方提供的接口枚举设备、查找设备属性或者监听设备状态,包括异步监听。

    资料:

  2. 如何枚举设备

    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
  3. 如何查找设备

    官方提供了几种查找设备的方法

    1. from_path(​*context, path*​ )

      根据设备路径查找设备

      from pyudev import Context, Devices
      Device.from_path(context, '/devices/platform')
      ---------------------------------
      Device(u'/sys/devices/platform')
      
    2. from_sys_path(​*context, sys_path*​ )

      根据系统设备路径查找设备

      from pyudev import Context, Devices
      Device.from_sys_path(context, '/sys//devices/platform')
      ---------------------------------
      Device(u'/sys/devices/platform')
      
    3. 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')
      
    4. 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')
      
    5. 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')
      
  4. 如何监听设备

    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))
    

    上面代码块的意思是,当插入、拔出、挂载、卸载存储设备时,会输出设备的行为以及设备地址。

  5. 获取到设备后获取设备属性

    下面列出一部分属性,具体看文档。想更全面的获取设备属性,不但要去了解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>
    

  • 11
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锡城筱凯

你的鼓励是我创造的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值