使用Python识别USB设备的驱动器号

时间:2016-10-19 14:47:27

标签: python

我有一个带有SD卡的USB复合设备。使用Python,我需要一种方法来在设备连接时找到SD卡的驱动器号。有任何人对此有经验吗?最初它需要在Windows中运行,但我最终需要将它移植到Mac和Linux。

3 个答案:

答案 0 :(得分:2)

我没有将SD卡连接到USB端口。为了帮助您入门,您可以在Windows上尝试。安装doc。我发现Windows .zip不会安装但是pip版本工作正常,或者至少它在Win7上运行。然后,您可以列出具有此类代码的逻辑磁盘。

>>> import wmi
>>> c=wmi.WMI()
... 
>>> for disk in c.Win32_LogicalDisk():
...     print(disk)

此代码提供了一个列表,其中包括提到NAS,这就是我希望您的SD卡的原因。可以进行各种改进。

答案 1 :(得分:2)

感谢Bill的建议,我能够使用WMI查询解决这个问题。正如他在回答中所说,你需要安装Tim Golden的WMI module

在这个例子中,我将使用Model&W; WDC WD20EZRX-00D8PB0 ATA Device"来搜索磁盘的驱动器号。查看所有已连接的驱动器。

import wmi
c = wmi.WMI ()

for drive in c.Win32_DiskDrive():
    print drive

获得模型后,可以将其添加到以下查询中:

import wmi
c = wmi.WMI ()

for disk in c.query('SELECT * FROM Win32_DiskDrive WHERE Model LIKE "WDC WD20EZRX-00D8PB0 ATA Device"'):
    deviceID = disk.DeviceID

    for partition in c.query('ASSOCIATORS OF {Win32_DiskDrive.DeviceID="' + deviceID + '"} WHERE AssocClass = Win32_DiskDriveToDiskPartition'):

        for logical_disk in c.query('ASSOCIATORS OF {Win32_DiskPartition.DeviceID="' + partition.DeviceID + '"} WHERE AssocClass = Win32_LogicalDiskToPartition'):
            print('Drive letter: {}'.format(logical_disk.DeviceID))

输出

Drive letter: K:

首先找到相应的磁盘,然后搜索该磁盘的分区,最后找到该分区的逻辑磁盘卷。

答案 2 :(得分:1)

我知道已经有3年了,但是我正在尝试解决类似的问题,只是我有一个要读取的已知大小的CF卡,所以我不得不从上述jgrant的最后一个示例中倒退。尽管如此,它还是非常有用的(感谢jgrant和Bill Bell),但是我也想在没有SQL的情况下做到这一点,而wmi包允许这样做。我个人并不在乎“ pythonic”或“ not pythonic”,但是对于那些可能喜欢无SQL语法版本的人(尽管很可能是在wmi的帮助下完成的),这是经过重新设计的从型号名称到驱动器号。注意,您可以很容易地折叠两个if块,使其仅嵌套在它们上面的条件下,但是我在这里将它们分开以更好地说明正在制作的wmi对象之间的连接:

import wmi

model = "Generic- USB3.0 CRW-CF/MD USB Device"

disks                      = wmi.WMI().Win32_DiskDrive()
drives_to_partitions       = wmi.WMI().Win32_DiskDriveToDiskPartition()
paritions_to_logical_disks = wmi.WMI().Win32_LogicalDiskToPartition()

drive_letter_name       = None
cf_drive_partition_name = None
drive_device_id         = None

for disk in disks:
    if disk.Model == model:
        drive_device_id = disk.DeviceID

if drive_device_id != None:
    for d_2_p in drives_to_partitions:
        if d_2_p.Antecedent.DeviceID == drive_device_id:
            cf_drive_partition_name = d_2_p.Dependent.DeviceID 
            #different DeviceID, don't let the reuse fool you

if cf_drive_partition_name != None:
    for p_2_ld in paritions_to_logical_disks:
        if p_2_ld.Antecedent.DeviceID == cf_drive_partition_name:
            drive_letter_name = p_2_ld.Dependent.DeviceID
            #yet another reuse of "DeviceID"

print(drive_letter_name)