我有一个带有SD卡的USB复合设备。使用Python,我需要一种方法来在设备连接时找到SD卡的驱动器号。有任何人对此有经验吗?最初它需要在Windows中工作,但我最终需要将它移植到Mac和Linux。
我没有连接USB端口的SD卡。为了帮助您入门,您可以在Windows上试用它。安装Golden's WMI。我发现Windows .zip不会安装但是pip版本工作正常,或者至少它在Win7上运行。然后,您可以列出具有此类代码的逻辑磁盘。
>>> import wmi
>>> c=wmi.WMI()
...
>>> for disk in c.Win32_LogicalDisk():
... print(disk)
这段代码提供了一个列表,其中包括提到NAS,这就是我对SD卡寄予厚望的原因。可以进行各种改进。
感谢Bill的建议,我能够使用WMI查询解决这个问题。正如他在回答中所说,你需要安装Tim Golden的WMI module。
在这个例子中,我将搜索模型为“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:
首先找到相应的磁盘,然后搜索该磁盘的分区,最后找到该分区的逻辑磁盘卷。
我知道它已经有3年了,但是我试图解决类似的问题,只是我有一个我想要读取的已知大小的compactflash卡,所以我不得不从上面的jgrant最后一个例子中倒退。不过,它非常有用(谢谢jgrant和Bill Bell),但我也想在没有SQL的情况下这样做,wmi包允许这样做。我个人并不关心“pythonic”或“not pythonic”,但是对于那些可能喜欢SQL语法的版本(虽然很可能是wmi的内幕功能),这里有一个重写的版本上面从型号名称到驱动器号。注意,你可以很容易地将两个if-blocks折叠成只嵌套在它们上面的条件下,但是我把它们分开来更好地说明正在制作的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)