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