Skip to main content
 首页 » 编程设计

python之libusb 似乎在类编码结构下失败,但没有类编码结构也能工作

2025年05月04日8duanxz

我有一个使用 Python/NXT/libusb 的简单工作示例,如下所示(注意:使用具有 USB 接口(interface)的乐高 NXT):

import nxt.locator 
from nxt.motor import * 
 
def flip_cube(b): 
   m_arm = Motor(b, PORT_B) 
   m_arm.turn(75, 85) 
   m_arm.turn(-50, 85) 
 
b = nxt.locator.find_one_brick() 
flip_cube(b) 

以上工作正常。

作为训练练习,我尝试“对象化”python 代码,这样我就可以开始在代码周围放置库,但现在 LibUSB 库提示它找不到 USB 设备。嗯?我究竟做错了什么。这是我尝试使用类结构的代码:

import nxt.locator 
from nxt.motor import * 
 
class BasicRobotTestCase(): 
    __test__ = True 
 
    def __init__(self): 
        b = nxt.locator.find_one_brick() 
 
    def flip_cube(self): 
        m_arm = Motor(b, PORT_B) 
        m_arm.turn(75, 85) 
        m_arm.turn(-50, 85) 
 
    def test_flip_cube(self): 
        flip_cube() 

当我执行上面的代码时,出现以下错误(即使我重新执行第一个示例,它再次执行正常):

E 
====================================================================== 
ERROR: Failure: USBError (No such device (it may have been disconnected)) 
---------------------------------------------------------------------- 
Traceback (most recent call last): 
  File "/Library/Python/2.6/site-packages/nose-0.11.4-py2.6.egg/nose/loader.py", line 485, in makeTest 
    return self._makeTest(obj, parent) 
  File "/Library/Python/2.6/site-packages/nose-0.11.4-py2.6.egg/nose/loader.py", line 539, in _makeTest 
    return MethodTestCase(obj) 
  File "/Library/Python/2.6/site-packages/nose-0.11.4-py2.6.egg/nose/case.py", line 331, in __init__ 
    self.inst = self.cls() 
  File "/Users/gnunez/git-projects/pdca_automation/rubics/tests/basic_robot_test_case.py", line 8, in __init__ 
    b = nxt.locator.find_one_brick() 
  File "/Users/gnunez/git-projects/pdca_automation/nxt/locator.py", line 112, in find_one_brick 
    for s in find_bricks(host, name, silent, method): 
  File "/Users/gnunez/git-projects/pdca_automation/nxt/locator.py", line 43, in find_bricks 
    for s in socks: 
  File "/Users/gnunez/git-projects/pdca_automation/nxt/usbsock.py", line 83, in find_bricks 
    for bus in usb.busses(): 
  File "build/bdist.macosx-10.6-universal/egg/usb/legacy.py", line 330, in busses 
    return (Bus(),) 
  File "build/bdist.macosx-10.6-universal/egg/usb/legacy.py", line 326, in __init__ 
    self.devices = [Device(d) for d in core.find(find_all=True)] 
  File "build/bdist.macosx-10.6-universal/egg/usb/legacy.py", line 311, in __init__ 
    self.configurations = [Configuration(c) for c in dev] 
  File "build/bdist.macosx-10.6-universal/egg/usb/core.py", line 706, in __iter__ 
    yield Configuration(self, i) 
  File "build/bdist.macosx-10.6-universal/egg/usb/core.py", line 407, in __init__ 
    configuration 
  File "build/bdist.macosx-10.6-universal/egg/usb/_debug.py", line 52, in do_trace 
    return f(*args, **named_args) 
  File "build/bdist.macosx-10.6-universal/egg/usb/backend/libusb10.py", line 423, in get_configuration_descriptor 
    config, byref(cfg))) 
  File "build/bdist.macosx-10.6-universal/egg/usb/backend/libusb10.py", line 357, in _check 
    raise USBError(_str_error[retval.value]) 
USBError: No such device (it may have been disconnected) 

请您参考如下方法:

创建 BasicRobotTestCase 时,如果不将 b 变量存储为实例的成员(即 self.b),则会丢失 b 变量

编辑: 好吧,丢失的 self 不是问题的根源,也许 nose 实例化你的类的方式改变了一些东西到 USB 抓取,尝试实例化直接上课。

import nxt.locator 
from nxt.motor import * 
 
class BasicRobotTestCase(): 
    __test__ = True 
 
    def __init__(self): 
        self.b = nxt.locator.find_one_brick()   # Store the brick in self.b 
 
    def flip_cube(self): 
        m_arm = Motor(self.b, PORT_B)   # use the stored brick in self.b to create the motor 
        m_arm.turn(75, 85) 
        m_arm.turn(-50, 85) 
 
    def test_flip_cube(self): 
        self.flip_cube() 
 
if __name__=="__main__": 
    BasicRobotTestCase().test_flip_cube()