Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Python识别USB设备的驱动器号_Python - Fatal编程技术网

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

使用Python识别USB设备的驱动器号,python,Python,我有一个USB复合设备,它有一个SD卡。使用Python,我需要一种在连接设备时查找SD卡驱动器号的方法。有人有这方面的经验吗?最初它需要在Windows下工作,但我最终需要将它移植到Mac和Linux。我没有将SD卡连接到USB端口。要开始,您可以在Windows上尝试此功能。安装。我发现Windows.zip不会安装,但pip版本运行良好,或者至少在Win7上可以。然后,您可以使用如下代码列出逻辑磁盘 >>> import wmi >>> c=wmi.WM

我有一个USB复合设备,它有一个SD卡。使用Python,我需要一种在连接设备时查找SD卡驱动器号的方法。有人有这方面的经验吗?最初它需要在Windows下工作,但我最终需要将它移植到Mac和Linux。

我没有将SD卡连接到USB端口。要开始,您可以在Windows上尝试此功能。安装。我发现Windows.zip不会安装,但pip版本运行良好,或者至少在Win7上可以。然后,您可以使用如下代码列出逻辑磁盘

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

这段代码提供了一个清单,其中提到了NAS,这就是为什么我对您的SD卡抱有希望。可以进行各种改进。

我没有将SD卡连接到USB端口。要开始,您可以在Windows上尝试此功能。安装。我发现Windows.zip不会安装,但pip版本运行良好,或者至少在Win7上可以。然后,您可以使用如下代码列出逻辑磁盘

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

这段代码提供了一个清单,其中提到了NAS,这就是为什么我对您的SD卡抱有希望。可以进行各种改进。

多亏了比尔的建议,我才能够使用WMI查询解决这个问题。正如他在回答中所说,您需要安装Tim Golden的

在本例中,我将搜索型号为“WDC WD20EZRX-00D8PB0 ATA设备”的磁盘的驱动器号。查看所有连接的驱动器

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:

首先找到合适的磁盘,然后搜索该磁盘以查找分区,最后找到该分区的逻辑磁盘卷。

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

在本例中,我将搜索型号为“WDC WD20EZRX-00D8PB0 ATA设备”的磁盘的驱动器号。查看所有连接的驱动器

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和billbell),但我也希望在不使用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)            

我知道已经三年了,但我试图解决一些类似的问题,只是我有一个已知大小的compactflash卡,我试图阅读,所以我不得不从jgrant上面的最后一个例子中回顾。尽管如此,它还是非常有帮助(感谢jgrant和billbell),但我也希望在不使用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)            

如果您试图在线程内执行此操作,请参见此。您需要导入pythoncom,并调用pythoncom.CoInitialize(),如果您试图在线程内执行此操作,请参见以下内容。您需要导入pythoncom,并调用pythoncom.CoInitialize()