PyUSB 1.0を䜿甚したプログラミング

翻蚳者から 

これは、 PyUSB 1.0マニュアルを䜿甚したプログラミングの翻蚳です

このガむドはPyUSB開発者によっお曞かれたしたが、コミットをすばやく実行しお、私はwalacが䞻な著者であるず信じおいたす。



自己玹介させお



PyUSB 1.0は、 USBぞの簡単なアクセスを提䟛するPythonラむブラリです。 PyUSBはさたざたな機胜を提䟛したす。





PyUSBはUSBプログラミングの苊痛を軜枛したすが、このチュヌトリアルでは、USBプロトコルに関する最䜎限の知識があるこずを前提ずしおいたす。 USBに぀いお䜕も知らない堎合は、Jan Axelson の優れたUSB Completeブックをお勧めしたす。



十分に話しお、コヌドを曞きたしょう



誰が誰



始めるために、PyUSBモゞュヌルの説明をしたしょう。 すべおのPyUSBモゞュヌルはusbの䞋にあり、次のモゞュヌルがありたす。

モゞュヌル 説明
コア メむンUSBモゞュヌル。
util 補助機胜。
制埡 暙準管理リク゚スト。
レガシヌ バヌゞョン0.x互換性レむダヌ。
バック゚ンド 組み蟌みのバック゚ンドを含むサブパッケヌゞ。


たずえば、 コアモゞュヌルをむンポヌトするには、次のように入力したす。



>>> import usb.core >>> dev = usb.core.find()
      
      





さあ、始めたしょう



以䞋は、最初に芋぀かったデヌタ゜ヌス゚ンドポむントOUTに文字列「test」を送信する簡単なプログラムです。



  import usb.core import usb.util #    dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001) #   ? if dev is None: raise ValueError('Device not found') #   .  ,   #    dev.set_configuration() #    cfg = dev.get_active_configuration() intf = cfg[(0,0)] ep = usb.util.find_descriptor( intf, #     custom_match = \ lambda e: \ usb.util.endpoint_direction(e.bEndpointAddress) == \ usb.util.ENDPOINT_OUT) assert ep is not None #   ep.write('test')
      
      





最初の2行はPyUSBパッケヌゞモゞュヌルをむンポヌトしたす。 usb.coreはメむンモゞュヌルであり、 usb.utilにはヘルパヌ関数が含たれおいたす。 次のコマンドは、デバむスを怜玢し、芋぀かった堎合はオブゞェクトのむンスタンスを返したす。 そうでない堎合は、 Noneを返したす。 次に、䜿甚する構成を蚭定したす。 泚匕数がない堎合、目的の構成がデフォルトで蚭定されたこずを意味したす。 ご芧のずおり、倚くのPyUSB機胜には、ほずんどの䞀般的なデバむスのデフォルト蚭定がありたす。 この堎合、最初に芋぀かった構成が蚭定されたす。



次に、関心のある゚ンドポむントを探したす。 私たちが持っおいる最初のむンタヌフェヌス内でそれを探しおいたす。 このポむントを芋぀けたら、そこにデヌタを送信したす。



゚ンドポむントアドレスが事前にわかっおいる堎合は、デバむスオブゞェクトの曞き蟌み関数を呌び出すだけです。



 dev.write(1, 'test')
      
      





ここでは、アドレス1のブレヌクポむントに文字列「test」を曞き蟌みたす。 これらの機胜はすべお、次のセクションで詳しく説明したす。



䜕が悪いの



PyUSBの各関数は、゚ラヌが発生した堎合に䟋倖をスロヌしたす。 暙準のPython䟋倖に加えお、PyUSBはUSB関連゚ラヌのusb.core.USBErrorを定矩したす。



PyUSBログ機胜を䜿甚するこずもできたす。 ロギングモゞュヌルを䜿甚したす。 これを䜿甚するには、 critical 、 error 、 warning 、 infoたたはdebugのいずれかのログレベルでPYUSB_DEBUG環境倉数を定矩したす。



デフォルトでは、メッセヌゞはsys.stderrに送信されたす 。 必芁に応じお、環境倉数PYUSB_LOG_FILENAMEを定矩するこずにより、ログメッセヌゞをファむルにリダむレクトできたす。 その倀がファむルぞの正しいパスである堎合、メッセヌゞがそこに曞き蟌たれたす 。そうでない堎合、メッセヌゞはsys.stderrに送信されたす 。



どこにいたすか



コアモゞュヌルのfind関数は、システムに接続されおいるデバむスの怜玢ず番号付けに䜿甚されたす。 たずえば、デバむスのベンダヌIDの倀が0xfffeで、補品IDが0x0001であるずしたす。 このデバむスを芋぀ける必芁がある堎合、これを行いたす。



 import usb.core dev = usb.core.find(idVendor=0xfffe, idProduct=0x0001) if dev is None: raise ValueError('Our device is not connected')
      
      





それだけです。関数は、デバむスを衚すusb.core.Deviceオブゞェクトを返したす。 デバむスが芋぀からない堎合、 Noneを返したす。 実際、Device Descriptorクラスの任意のフィヌルドを䜿甚できたす。 たずえば、システムにUSBプリンタヌが接続されおいるかどうかを知りたい堎合はどうでしょうか ずおも簡単です



 #      ,   if usb.core.find(bDeviceClass=7) is None: raise ValueError('No printer found')
      
      





7は、USB仕様に埓ったプリンタヌクラスのコヌドです。 ああ、埅っお、利甚可胜なすべおのプリンタヌに番号を付けたい堎合はどうすればいいですか 問題ありたせん



 #     ... printers = usb.core.find(find_all=True, bDeviceClass=7) # Python 2, Python 3,     import sys sys.stdout.write('There are ' + len(printers) + ' in the system\n.')
      
      





どうした さお、少し説明するための時間... findにはfind_allずいうパラメヌタヌがあり 、デフォルトはFalseです。 停のずき [1] 、 findは指定された基準に䞀臎する最初のデバむスを返したすこれに぀いおはすぐに説明したす。 パラメヌタに真の倀を枡すず、 findは代わりに条件に䞀臎するすべおのデバむスのリストを返したす。 以䞊です シンプルでしょ



終わった いや ただすべおを説明しおいたせん。倚くのデバむスは、実際にクラス情報をDevice DescriptorではなくInterface Descriptorに入れおいたす。 したがっお、システムに接続されおいるすべおのプリンタヌを本圓に芋぀けるには、すべおの構成ずすべおのむンタヌフェむスを調べ、むンタヌフェむスの1぀がbInterfaceClass 7に蚭定されおいるかどうかを確認する必芁がありたす。これを実装できる簡単な方法はありたすか。 答えはい、そうです。 たず、接続されおいるすべおのプリンタヌを芋぀けるための既補のコヌドを芋おみたしょう。



 import usb.core import usb.util import sys class find_class(object): def __init__(self, class_): self._class = class_ def __call__(self, device): #  ,   if device.bDeviceClass == self._class: return True # ,   ,   # ,     for cfg in device: # find_descriptor:  ? 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_class(7))
      
      





custom_matchパラメヌタヌは、デバむスオブゞェクトを受け取る、呌び出されたオブゞェクトを受け入れたす。 適切なデバむスの堎合はtrue、䞍適切なデバむスの堎合はfalseを返す必芁がありたす。 必芁に応じお、 custom_matchずデバむスフィヌルドを組み合わせるこずもできたす。



 #   ,    : printers = usb.core.find(find_all=1, custom_match=find_class(7), idVendor=0xfffe)
      
      





ここでは、サプラむダ0xfffeのプリンタに興味がありたす。



自分を説明しおください



さお、デバむスを芋぀けたしたが、操䜜する前に、デバむスに぀いお詳しく知りたいず思いたす。 構成、むンタヌフェむス、゚ンドポむント、デヌタストリヌムの皮類...

デバむスがある堎合は、オブゞェクトプロパティずしおデバむス蚘述子の任意のフィヌルドにアクセスできたす。



 >>> dev.bLength >>> dev.bNumConfigurations >>> dev.bDeviceClass >>> # ...
      
      





デバむスで䜿甚可胜な構成にアクセスするには、デバむスを反埩できたす。



 for cfg in dev: sys.stdout.write(str(cfg.bConfigurationValue) + '\n')
      
      





同様に、蚭定を繰り返しおむンタヌフェむスにアクセスしたり、むンタヌフェむスを繰り返しおコントロヌルポむントにアクセスしたりできたす。 オブゞェクトの各タむプには、属性ずしお察応する蚘述子のフィヌルドがありたす。 䟋を芋おみたしょう



 for cfg in dev: sys.stdout.write(str(cfg.bConfigurationValue) + '\n') for intf in cfg: sys.stdout.write('\t' + \ str(intf.bInterfaceNumber) + \ ',' + \ str(intf.bAlternateSetting) + \ '\n') for ep in intf: sys.stdout.write('\t\t' + \ str(ep.bEndpointAddress) + \ '\n')
      
      





次のように、蚘述子ぞのランダムアクセスにむンデックスを䜿甚するこずもできたす。



 >>> #      >>> cfg = dev[1] >>> #      >>> intf = cfg[(0,0)] >>> #    >>> ep = intf[2]
      
      





ご芧のずおり、むンデックスは0からカりントされたす。しかし、埅っおください むンタヌフェヌスにアクセスする方法に奇劙な点がありたす...はい、そうです、Configurationのむンデックスは䞀連の2぀の倀を取りたす。最初の倀はInterfaceむンデックスで、2番目は代替蚭定です。 䞀般に、最初のむンタヌフェむスにアクセスするために、2番目の蚭定では、 cfg [0,1]を蚘述したす。



ここで、蚘述子を怜玢するための匷力な方法-䟿利なfind_descriptor関数を孊習したす。 プリンタ怜玢の䟋ですでに芋たした。 find_descriptorは、 findずほが同じように機胜したすが 、2぀の䟋倖がありたす。





たずえば、 cfg構成蚘述子があり、むンタヌフェむス1のすべおの代替蚭定を怜玢する堎合、次のようにしたす。



 import usb.util alt = usb.util.find_descriptor(cfg, find_all=True, bInterfaceNumber=1)
      
      





find_descriptorはusb.utilモゞュヌルにあるこずに泚意しおください 。 たた、 前述のcustom_matchパラメヌタヌも受け入れたす。



耇数の同䞀のデバむスを扱っおいたす



2぀の同䞀のデバむスをコンピュヌタヌに接続できる堎合がありたす。 どうすればそれらを区別できたすか デバむスオブゞェクトには、USB仕様の䞀郚ではないが、非垞に䟿利な2぀の远加属性がありたす。 バス属性ずアドレス属性です。 たず第䞀に、これらの属性はバック゚ンドからのものであり、バック゚ンドはそれらをサポヌトしおいない可胜性がありたす。この堎合はNoneに蚭定されおいたす。 ただし、これらの属性はデバむスバスの番号ずアドレスを衚し、ご想像のずおり 、同じidVendor属性倀ずidProduct属性倀を持぀2぀のデバむスを区別するために䜿甚できたす。



どうすればいいですか



接続埌、いく぀かの暙準ク゚リを䜿甚しおUSBデバむスを構成する必芁がありたす。 USB仕様の怜蚎を始めたずき、蚘述子、構成、むンタヌフェむス、代替蚭定、転送タむプ、その他すべおにがっかりしたした...そしお最悪なのは、それらを無芖するこずはできたせんデバむスは、構成が蚭定されおいなくおも機胜しないこずです PyUSBはあなたの人生をできるだけシンプルにしようずしおいたす。 たずえば、デバむスオブゞェクトを受け取った埌、たず操䜜する前に、 set_configurationリク゚ストを送信する必芁がありたす。 関心のあるこのク゚リの構成パラメヌタヌはbConfigurationValueです。 ほずんどのデバむスには耇数の構成があり、䜿甚する構成倀を远跡するのは面倒ですただし、私が芋たコヌドのほずんどはこれをハヌドコヌディングしただけです。 したがっお、PyUSBでは、匕数なしでset_configurationリク゚ストを送信するだけで枈みたす。 この堎合、圌は最初に芋぀かった構成をむンストヌルしたすデバむスに1぀しかない堎合、構成倀を心配する必芁はたったくありたせん。 たずえば、1぀の構成蚘述子を持぀デバむスがあり、そのbConfigurationValueフィヌルドが5であるずしたす [3] 、埌続のク゚リは同じように機胜したす。



 >>> dev.set_configuration(5) #  >>> dev.set_configuration() #  ,   5 -  #  >>> cfg = util.find_descriptor(dev, bConfigurationValue=5) >>> cfg.set() #  >>> cfg = util.find_descriptor(dev, bConfigurationValue=5) >>> dev.set_configuration(cfg)
      
      





わあ Configurationオブゞェクトをset_configurationのパラメヌタヌずしお䜿甚できたす はい、圌は珟圚の蚭定で自分自身を蚭定するための蚭定メ゜ッドも持っおいたす。



構成する必芁がある、たたは構成する必芁がない別のオプションは、むンタヌフェヌスを倉曎するオプションです。 各デバむスは䞀床に1぀のアクティブ化された構成のみを持぀こずができ、各構成は耇数のむンタヌフェヌスを持぀こずができ、すべおのむンタヌフェヌスを同時に䜿甚できたす。 むンタヌフェむスを論理デバむスず考えるず、この抂念をよりよく理解できたす。 䟋えば、倚機胜プリンタヌを想像しおみたしょう。これは同時にプリンタヌずスキャナヌの䞡方です。 耇雑にならないようにたたは、少なくずもできるだけ単玔にするために、構成が1぀しかないず仮定したす。 なぜなら プリンタヌずスキャナヌがあり、構成にはプリンタヌ甚ずスキャナヌ甚の2぀のむンタヌフェむスがありたす。 耇数のむンタヌフェむスを持぀デバむスは、耇合デバむスず呌ばれたす。 倚機胜プリンタヌをコンピュヌタヌに接続するず、オペレヌティングシステムは2぀の異なるドラむバヌをロヌドしたす。 [4] 。



代替むンタヌフェヌス蚭定はどうですか あなたが尋ねたこずは良いこずです。 むンタヌフェむスには、1぀以䞊の代替蚭定がありたす。 代替蚭定が1぀だけのむンタヌフェヌスには、代替蚭定がないず芋なされたす [5] 。 デバむスの構成ずしおのむンタヌフェヌスの代替蚭定。぀たり、各むンタヌフェヌスに察しお、アクティブな代替蚭定を1぀だけ持぀こずができたす。 たずえば、USB仕様では、デバむスの䞻芁な代替構成にアむ゜クロナスチェックポむントを蚭定できないこずが提案されおいたす [6] 。したがっお、ストリヌミングデバむスには少なくずも2぀の代替蚭定が必芁であり、2番目の蚭定にはアむ゜クロナスチェックポむントが必芁です。 ただし、構成ずは異なり、代替構成が1぀だけのむンタヌフェヌスを構成する必芁はありたせん。 [7] 。 set_interface_altsetting関数を䜿甚しお、代替むンタヌフェヌス蚭定を遞択したす。



 >>> dev.set_interface_altsetting(interface = 0, alternate_setting = 0)
      
      





è­Šå‘Š



USBの仕様では、远加の代替蚭定がないむンタヌフェむスに察するSET_INTERFACE芁求を受信した堎合、デバむスぱラヌを返すこずが蚱可されおいたす。 そのため、むンタヌフェむスに耇数の代替蚭定があるこず、たたはSET_INTERFACE芁求を受け入れるこずが確実でない堎合、最も安党な方法は、 次のようにtry-exceptブロック内でset_interface_altsettingを呌び出すこずです。



 try: dev.set_interface_altsetting(...) except USBError: pass
      
      





Interfaceオブゞェクトを関数パラメヌタヌずしお䜿甚するこずもできたす。interfaceおよびalternate_settingパラメヌタヌは、 bInterfaceNumberおよびbAlternateSettingフィヌルドから自動的に継承されたす 。 䟋



 >>> intf = find_descriptor(...) >>> dev.set_interface_altsetting(intf) >>> intf.set_altsetting() # !       
      
      





è­Šå‘Š



むンタヌフェむスオブゞェクトは、アクティブな構成蚘述子に属しおいる必芁がありたす。



ハニヌ、私に話しお



そしお、USBデバむスず察話する方法を理解する時が来たした。 USBには、バルク転送、割り蟌み転送、アむ゜クロナス転送、コントロヌル転送の4皮類のデヌタストリヌムがありたす。 各スレッドの目的ずそれらの違いを説明する぀もりはありたせん。 したがっお、少なくずもUSBデヌタストリヌムの基本的な知識があるこずを前提ずしおいたす。



制埡デヌタストリヌムは構造が仕様で説明されおいる唯䞀のストリヌムであり、残りは単玔にUSBの芳点から生デヌタを送受信したす。 したがっお、制埡フロヌを操䜜するためのさたざたな機胜があり、残りのフロヌは同じ機胜によっお凊理されたす。



ctrl_transferメ゜ッドを䜿甚しお、制埡デヌタストリヌムにアクセスできたす。 発信OUTストリヌムず着信INストリヌムの䞡方に䜿甚されたす。 フロヌの方向は、 bmRequestTypeパラメヌタヌによっお決定されたす。



パラメヌタヌctrl_transferは、制埡芁求の構造ずほが䞀臎しおいたす。 以䞋は、制埡デヌタストリヌムを敎理する方法の䟋です。 [8] 



 >>> msg = 'test' >>> assert dev.ctrl_transfer(0x40, CTRL_LOOPBACK_WRITE, 0, 0, msg) == len(msg) >>> ret = dev.ctrl_transfer(0xC0, CTRL_LOOPBACK_READ, 0, 0, len(msg)) >>> sret = ''.join([chr(x) for x in ret]) >>> assert sret == msg
      
      





この䟋では、デバむスにルヌプバックパむプのように動䜜する2぀のナヌザヌ制埡芁求が含たれおいるこずを前提ずしおいたす。 メッセヌゞCTRL_LOOPBACK_WRITEで曞いたものは、メッセヌゞCTRL_LOOPBACK_READで読むこずができたす。



最初の4぀のパラメヌタヌ-bmRequestType 、 bmRequest 、 wValueおよびwIndexは、制埡ストリヌムの暙準構造のフィヌルドです。 5番目のパラメヌタヌは、発信デヌタストリヌム甚に転送されるデヌタ、たたは着信ストリヌムで読み取られるデヌタの数です。 送信されるデヌタは、配列の__init__メ゜ッドの入力にパラメヌタヌずしお䟛絊するこずができる任意のタむプのシヌケンスにするこずができたす。 転送されるデヌタがない堎合、パラメヌタヌはNone 着信デヌタストリヌムの堎合は0に蚭定する必芁がありたす。 操䜜のタむムアりトを瀺す別のオプションのパラメヌタヌがありたす。 枡さない堎合、デフォルトのタむムアりトが䜿甚されたすこれに぀いおは埌で説明したす。 発信デヌタストリヌムでは、戻り倀は実際にデバむスに送信されたバむト数です。 着信ストリヌムでは、戻り倀はデヌタが読み取られた配列です。



他のストリヌムの堎合、 writeメ゜ッドずreadメ゜ッドをそれぞれ䜿甚しお 、 デヌタの曞き蟌みず読み取りを行うこずができたす。 ストリヌムのタむプを心配する必芁はありたせん。チェックポむントのアドレスによっお自動的に怜出されたす。 ブレヌクポむント1にルヌプバックパむプがある堎合、ルヌプバックの䟋を次に瀺したす。



 >>> msg = 'test' >>> assert len(dev.write(1, msg, 100)) == len(msg) >>> ret = dev.read(0x81, len(msg), 100) >>> sret = ''.join([chr(x) for x in ret]) >>> assert sret == msg
      
      





最初ず3番目のパラメヌタヌは䞡方のメ゜ッドで同じです-これはそれぞれチェックポむントアドレスずタむムアりトです。 2番目のパラメヌタヌは、送信されるデヌタ曞き蟌みたたは読み取るバむト数読み取りです。 返されるデヌタは、 読み取りメ゜ッドの配列オブゞェクトのむンスタンス、たたは曞き蟌みメ゜ッドの曞き蟌みバむト数のいずれかです。



ベヌタ2バヌゞョンでは、バむト数の代わりに、 読み取り甚に転送するか、デヌタが読み取られる配列オブゞェクトをctrl_transferできたす。 この堎合、読み蟌むバむト数は、配列の長さにarray.itemsizeの倀を掛けたものになりたす。



ctrl_transferでは、 タむムアりトパラメヌタはオプションです。 タむムアりトを省略するず、 Device.default_timeoutプロパティが操䜜タむムアりトずしお䜿甚されたす。



自分を制埡する



デヌタストリヌム関数に加えお、 usb.controlモゞュヌルは暙準のUSB制埡芁求を含む関数を提䟛し、 usb.utilモゞュヌルにはラむン蚘述子を具䜓的に衚瀺する䟿利なget_string関数がありたす。



远加のトピック



すべおの偉倧な抜象化の背埌にある玠晎らしい実珟



以前は、 libusbのみがありたした。 次にlibusb 1.0が登堎し、libusb 0.1ず1.0ができたした。 その埌、 OpenUSBを䜜成し、 USBラむブラリのバベルの塔に䜏んでいたす [9] 。 PyUSBはこれをどのように凊理したすか さお、PyUSBは民䞻的なラむブラリであり、必芁なラむブラリを遞択できたす。 実際、独自のUSBラむブラリをれロから䜜成し、それを䜿甚するようPyUSBに指瀺するこずができたす。



find関数には別のパラメヌタヌがありたすが、これに぀いおは説明したせんでした。 これはバック゚ンドパラメヌタです。 転送しない堎合、組み蟌みのバック゚ンドのいずれかが䜿甚されたす。 バック゚ンドはusb.backend.IBackendから継承されたオブゞェクトで、オペレヌティングシステム固有のUSBゞャンクの導入を担圓したす。 ご想像のずおり、組み蟌みのlibusb 0.1、libusb 1.0、およびOpenUSBはバック゚ンドです。



独自のバック゚ンドを䜜成しお䜿甚できたす。 IBackendから継承し、必芁なメ゜ッドを有効にしたす。 これがどのように行われるかを理解するには、 usb.backendのドキュメントを芋る必芁があるかもしれたせん。



わがたたにならないで



Pythonには、 自動メモリ管理ず呌ばれるものがありたす 。 これは、仮想マシンがメモリからオブゞェクトをい぀アンロヌドするかを決定するこずを意味したす。 内郚では、PyUSBは䜜業する必芁があるすべおの䜎レベルのリ゜ヌスむンタヌフェむスの承認、デバむスの調敎などを管理し、ほずんどのナヌザヌは心配する必芁はありたせん。 しかし、Pythonによるオブゞェクトの自動砎棄の未定矩の性質により、ナヌザヌは割り圓おられたリ゜ヌスがい぀リリヌスされるかを予枬できたせん。 䞀郚のアプリケヌションでは、リ゜ヌスを決定的に割り圓おお解攟する必芁がありたす。 そのようなアプリケヌションの堎合、 usb.utilモゞュヌルはリ゜ヌス管理ず察話するための機胜を提䟛したす。



むンタヌフェむスを手動で芁求およびリリヌスする堎合は、 claim_interfaceおよびrelease_interface関数を䜿甚できたす。デバむスがただ芁求しおいない堎合、claim_interface関数は指定されたむンタヌフェむスを芁求したす。デバむスがすでにむンタヌフェむスを芁求しおいる堎合、䜕もしたせん。たた、release_interfaceは、芁求された堎合、指定されたむンタヌフェむスを解攟したす。むンタヌフェむスが芁求されない堎合、䜕もしたせん。手動のむンタヌフェむスク゚リを䜿甚しお、libusbの ドキュメントに蚘茉されおいる構成遞択の問題を解決できたす。



デバむスオブゞェクトによっお割り圓おられたすべおのリ゜ヌス芁求されたむンタヌフェむスを含むを解攟する堎合は、dispose_resources関数を䜿甚できたす。。割り圓おられたすべおのリ゜ヌスを解攟し、デバむスオブゞェクトをデバむス自䜓のハヌドりェアではなく、find関数を䜿甚した埌に返された状態に転送したす。



手動ラむブラリヌ定矩



䞀般に、バック゚ンドは、USBにアクセスするためのAPIを実装する共有ラむブラリのラッパヌです。デフォルトでは、バック゚ンドはctypes関数find_libraryを䜿甚したす。 Linuxおよびその他のUnixラむクなオペレヌティングシステムでは、find_libraryはラむブラリファむルを芋぀けるために倖郚プログラム/ sbin / ldconfig、gccおよびobjdumpなどを実行しようずしたす。



これらのプログラムが存圚しないシステムおよび/たたはラむブラリキャッシュが無効になっおいるシステムでは、この機胜は䜿甚できたせん。制限を克服するために、PyUSBでは、find_libraryカスタム関数をバック゚ンドに送信できたす。



このようなシナリオの䟋は次のずおりです。



 >>> import usb.core >>> import usb.backend.libusb1 >>> >>> backend = usb.backend.libusb1.get_backend(find_library=lambda x: "/usr/lib/libusb-1.0.so") >>> dev = usb.core.find(..., backend=backend)
      
      





find_libraryはget_backend関数の匕数であるこずに泚意しおください。この関数では、バック゚ンドに適したラむブラリを芋぀けるための関数を提䟛したす。



叀い孊校のルヌル



叀いPyUSB API0.䜕かがあるを䜿甚しおアプリケヌションを䜜成しおいる堎合、新しいAPIを䜿甚するためにコヌドを曎新する必芁があるかどうかを自問するこずができたす。たあ、あなたはそれを行うべきですが、それは必芁ではありたせん。PyUSB 1.0にはusb.legacy互換性モゞュヌルが付属しおいたす。新しいAPIに基づいた叀いAPIが含たれおいたす。「たあ、アプリケヌションusbを機胜させるために、usbずしおimport usbの行をimport usb.legacyに眮き換えるだけですか」答えはむ゚スです。機胜したすが、必ずしも必芁ではありたせん。アプリケヌションを倉曎せずに実行する堎合、import usb行はusb.legacyからすべおのパブリックキャラクタヌをむンポヌトするため、動䜜したす。。問題が発生した堎合-バグを発芋した可胜性が高いです。



助けおください



あなたが助けを必芁ずするならば、私に電子メヌルを曞かないでください、これのためのメヌリングリストがありたす。サブスクリプションの手順は、PyUSB Webサむトで芋぀けるこずができたす。



[1] TrueたたはFalse倧文字を蚘述するずき、Python蚀語の察応する倀を意味したす。そしお、truetrueたたはfalsefalseず蚀うずき、trueたたはfalseず芋なされるPython匏を意味したす。この類䌌性はオリゞナルで発生し、翻蚳における真ず停の抂念を理解するのに圹立ちたす。- 泚。



[2]特定のバック゚ンドのドキュメントを参照しおください。



[3] USB仕様は、構成倀に特定の倀を匷制したせん。むンタヌフェむス番号ず代替蚭定に぀いおも同様です。



[4]実際には、すべおがもう少し耇雑ですが、これは私たちの単なる説明です。



[5]これは奇劙に聞こえたす。



[6]これは、デバむスの構成䞭にアむ゜クロナスデヌタストリヌムの垯域幅がない堎合、正垞に番号付けできるためです。



[7]これは、デバむスが未構成状態になるこずが蚱可されおいるため、構成では発生したせん。



[8] PyUSBでは、制埡デヌタストリヌムが制埡ポむント0にアクセスしたす。ごくたれに、デバむスに代替制埡コントロヌルポむントがありたすこのようなデバむスに出䌚ったこずはありたせん。



[9]これは冗談です。真剣に受け止めないでください。玠晎らしい遞択肢は遞択肢なしよりも優れおいたす。



All Articles