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」は予約語であり、構文エラーを引き起こす可能性があるためです。多分これはより良いでしょう:

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__()呼び出しごとに1回だけ返されます(明らかに)。呼び出される回数は、システムで見つかったデバイスによって異なります。

そこにあるループは、単一のデバイス専用です。デバイスがクラス 7 であるか、その構成のいずれかにクラス 7 とのインターフェースがある場合、カスタム検索は適切です (この場合) 。

于 2014-03-01T05:20:45.250 に答える