2

以下片段来自pyusb tutuorial。它被用来查找所有连接的打印机:

import usb.core
import usb.util
import sys

class find_class(object):
    def __init__(self, class_):
        self._class = class_
    def __call__(self, device):
        # first, let's check the device
        if device.bDeviceClass == self._class:
            return True
        # ok, transverse all devices to find an
        # interface that matches our class
        for cfg in device:
            # find_descriptor: what's it?
            intf = usb.util.find_descriptor(
                                    cfg,
                                    bInterfaceClass=self._class
                                )
            if intf is not None:
                return True

        return False

printers = usb.core.find(find_all=1, custom_match=find_all(7))

这个类似乎有多个点,它返回一个布尔值。发送了多少退货?

我也无法理解此代码如何搜索连接到系统的所有打印机。这段代码中让我无法理解的内容是:

  • device列表/元组吗?如果是,此代码如何通过if device.bDeviceClass == self._class:仅执行一次来检查所有设备?

  • 这一行发生了什么:self._class = class_

  • 为什么该类find_class从未实例化printers = usb.core.find(find_all=1, custom_match=find_all(7))

    如果您曾在 pyusb/任何 USB 程序上工作过,请告诉我如何。

4

2 回答 2

1

设备是列表/元组吗?

device是一个usb.core.Device。迭代它会产生配置

如果是,此代码如何通过if device.bDeviceClass == self._class:仅执行一次来检查所有设备?

它没有。您错过了“因此,要真正找到连接到系统的所有打印机,我们需要遍历所有配置,然后检查所有接口并检查其中一个接口的 bInterfaceClass 字段是否等于 7。”的部分。

这一行发生了什么:self._class = class_

正是它所说的。它将该参数中的对象绑定到该属性。供以后使用。

为什么类 find_class 从未实例化printers = usb.core.find(find_all=1, custom_match=find_all(7))

因为有人有想法。最后一部分应该是...=find_class(7)

于 2014-03-01T04:44:08.167 回答
1

为什么类find_class从不实例化printers = usb.core.find(find_all=1, custom_match=find_all(7))

在您链接到的教程中,您会发现这是一个错字。教程中的下一行正确使用custom_match=find_class(7).

这一行发生了什么:self._class = class_

在此处的示例中,它设置self._class = 7. (来自行find_class(7)。)不使用的原因self.class = class是“类”是一个保留字,会引起语法错误。也许这会更好:

class find_class(object):
    def __init__(self, class_nr):
        self.class_nr = class_nr

我也无法理解此代码如何搜索连接到系统的所有打印机。

如教程中所述,usb.core.find()返回找到的第一个设备,除非您将真值传递给find_all参数。– 搜索所有设备的不是您看到的代码,而是搜索所有设备的代码usb.core.find()。– 它还回答了下一个问题:

device列表/元组吗?

不。

这个类似乎有多个点,它返回一个布尔值。发送了多少退货?

__call__()为找到的每个设备调用usb.core.find()。设备传入device__call__()每次调用只会返回一次(显然)。它被调用多少次取决于系统中找到的设备。

您在那里找到的循环仅适用于单个设备!如果设备是 7 类或其任何配置具有与 7 类的接口,则自定义搜索很高兴(在这种情况下) 。

于 2014-03-01T05:20:45.250 回答