【问题标题】:Getting hard disk serial number (USB stick / ATA based) with pyudev使用 pyudev 获取硬盘序列号(基于 U 盘 / ATA)
【发布时间】:2014-04-23 10:08:09
【问题描述】:

一直在编写以下示例代码,以使用 pyudev 检索连接的 HDD 详细信息。

我正在尝试探测的设备:

  1. 普通 sata 硬盘
  2. USB 转 SATA 转换器
  3. U 盘

使用以下脚本,我已经能够检索 U 盘信息。但是,当我连接 USB 到 SATA 转换器时,我得到的是转换器的序列号,而不是 HDD。此外,对于我的常规 SATA 硬盘驱动器,“ID_VENDOR”出现异常。

样本输出:

    Device Connected Info:
    [Device(u'/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1/2-1.1:1.0/host9/target9:0:0/9:0:0:0/block/sdc'), 
    Device(u'/sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0/host7/target7:0:0/7:0:0:0/block/sdb'), 
    Device(u'/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda')]

Device Information:
SonyPendrive:
{'model': u'Storage Media', 'vendor': u'Sony', 'serial': u'CB071031B7E215C294'}
SATA IDE Converter
{'model': u'DE SATA Device', 'vendor': u'USB TO I', 'serial': u'000000000033'}
Regular HDD
Traceback (most recent call last):
  File "t.py", line 52, in <module>
    devInfo=decode_device_info(deviceRef)
  File "t.py", line 9, in decode_device_info
    vendor = device['ID_VENDOR'].replace('_',' ')
  File "/home/srivathsan/Desktop/pyudev-pyudev-3a26e05/pyudev/device.py", line 831, in __getitem__
    raise KeyError(property)
KeyError: 'ID_VENDOR'

示例代码:

import glib
from pyudev import Context, Monitor

def decode_device_info(device):
    ''' Accept a device. Return a dict of attributes of given device.
    Clean up all strings in the process and make pretty.
    '''
    vendor = device['ID_VENDOR'].replace('_',' ')
    model = device['ID_MODEL'].replace('_',' ')
    try:
        serial = device['ID_SERIAL_SHORT']
    except:
        serial = device['ID_SERIAL']
    return({'vendor':vendor, 'model':model, 'serial':serial})

def getDevicelist(udevContext):
    devices=[]
    for device in udevContext.list_devices(subsystem='block', DEVTYPE='disk'):
        # Filter out cd drives, loop devices.
        if device.get('ID_TYPE', '') == 'cd':
            continue
        if device.get('UDISKS_PRESENTATION_NOPOLICY', '0') == '1':
            continue
        devices.append(device)
    return devices

try:
    from pyudev.glib import MonitorObserver

    def device_event(observer, device):
        print 'event {0} on device {1}'.format(device.action, device)
except:
    from pyudev.glib import GUDevMonitorObserver as MonitorObserver

    def device_event(observer, action, device):
        print 'event {0} on device {1}'.format(action, device)

context = Context()
monitor = Monitor.from_netlink(context)
monitor.filter_by(subsystem='block')
observer = MonitorObserver(monitor)
observer.connect('device-event', device_event)
monitor.start()

devicesConnected=getDevicelist(context)
if (devicesConnected):
    print devicesConnected
    for deviceRef in devicesConnected:
        devInfo=decode_device_info(deviceRef)
        print devInfo 

glib.MainLoop().run()

有没有我遗漏的参数。请给我一些指点。

【问题讨论】:

    标签: python udev pyudev


    【解决方案1】:

    对于你得到的KeyError,你可以替换

    vendor = device['ID_VENDOR'].replace('_',' ')
    

    其中之一:

    try:
        vendor = device['ID_VENDOR'].replace('_',' ')
    except KeyError:
        vendor = ""
    

    vendor = device.get('ID_VENDOR', '').replace('_',' ')
    

    if 'ID_VENDOR' in device:
        vendor = device['ID_VENDOR'].replace('_',' ')
    else:
        vendor = ""
    

    但是,恐怕我不知道如何/是否可以使用pyudev 将 USB/SATA 转换器“超越”到连接到它的设备上。

    【讨论】:

    • 这使我的系统无法检测到 SATA 驱动器的序列号。这打破了我的整体意图。另外,除了pyudev还有其他获取硬件信息的机制吗
    猜你喜欢
    • 2011-05-04
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2010-11-24
    • 2014-12-31
    • 2010-12-06
    • 1970-01-01
    相关资源
    最近更新 更多