2009-08-22 42 views
2

這是錯誤。你對這個Python錯誤做了什麼?

Traceback (most recent call last): 
    File "_ctypes/callbacks.c", line 295, in 'calling callback function' 
    File "USB2.py", line 454, in ff 
    self.drv_locked = False 
SystemError: Objects/cellobject.c:24: bad argument to internal function 

下面是涉及的Python代碼。

def drv_send(self, data, size): 
    if not self.Connected(): 
     return 

    def f(): 
     self.drv_locked = True 
     buffer = ''.join(chr(c) for c in data[:size]) 
     out_buffer = cast(buffer, POINTER(c_uint8)) 
     request_handle = (OPENUSB_REQUEST_HANDLE * 1)() 
     request = (OPENUSB_INTR_REQUEST * 1)() 

     request_handle[0].dev = self.usbhandle 
     request_handle[0].interface = INTERFACE_ID 
     request_handle[0].endpoint = LIBUSB_ENDPOINT_OUT + 1 
     request_handle[0].type = USB_TYPE_INTERRUPT 
     request_handle[0].req.intr = request 
     def f(req): 
      print req[0].req.intr[0].result.status, req[0].req.intr[0].result.transferred_bytes 
      self.drv_locked = False # Line 454 
     request_handle[0].cb = REQUEST_CALLBACK(f) 
     request_handle[0].arg = None 

     request[0].payload = out_buffer 
     request[0].length = size 
     request[0].timeout = 5000 
     request[0].flags = 0 
     request[0].next = None 

     r = lib.openusb_xfer_aio(request_handle) 
     print "result", r 

    self.command_queue.put(f) 

以下是涉及的Python源代碼。

PyObject * 
PyCell_Get(PyObject *op) 
{ 
     if (!PyCell_Check(op)) { 
       PyErr_BadInternalCall(); // Line 24 
       return NULL; 
     } 
     Py_XINCREF(((PyCellObject*)op)->ob_ref); 
     return PyCell_GET(op); 
} 
+0

什麼是「自我」? – 2009-08-22 08:26:13

回答

6

一個內部錯誤顯然是Python本身的一個錯誤,如果您有興趣進一步探索這個併爲Python核心提供修復,那麼簡化您的代碼到它仍然觸發錯誤的地方將是正確的戰略。

如果您對代碼的工作更感興趣,而不是修復Python核心,那麼我建議您避免在代碼中出現一些可能導致混淆Python的異常。例如,我不知道有人曾經想過測試屬性名爲f的嵌套函數,它包含另一個進一步嵌套的函數名爲f它應該工作,但它正是那種可能沒有的東西經過很好的測試,因爲沒有人想到它,而故意激發這樣的異常是加強一套測試的一個非常好的策略,如果不是故意跳出來觸發Python內部的錯誤,這可能是最好的避免。

所以,首先,我會確保周圍沒有同調。如果仍然存在這個錯誤,我將通過將當前訪問非本地變量的內容變爲「預先綁定的參數」來刪除單元對象的使用,例如,您的「半外部」f可能會被更改爲以:

def f(self=self):

和你的「全內一個」將變成:

def g(req, self=self):

這將使訪問self在任的那些功能(目前非本地變量訪問)到局部變量的訪問。是的,你不應該這樣做(任何軟件都不應該有任何bug,需要你去解決它們),但是唉,完美並不是這個次級世界的特徵,所以學習bug-workaround策略是不可避免的生活的一部分;-)。

+0

這樣做到「完全內在」的問題在於它是一個ctypes回調,必須根據openusb的規範進行定義。無論如何,我找到了解決問題的辦法。使用openusb我不必排隊每次傳輸,不像libusb從來沒有完全與ctypes/Python一起工作。我只能使同步傳輸工作,並且它們不流暢,所以LCD沒有順利更新。使用openusb它很流暢,但即使我使用異步API,GUI也會鎖定。這很奇怪,但至少它有點作用。 – Scott 2009-08-22 22:59:35

2

PyCell_Check函數檢查其參數實際上是一個單元對象(一個內部類型用於實現由多個範圍引用的變量)。如果op不是一個單元對象,則會出現此錯誤。

您發佈的代碼沒有提供足夠的上下文/信息來確定錯誤參數是如何傳遞的。

+0

感謝您的澄清。這解釋了很多關於發生了什麼事情。 – Scott 2009-08-22 23:01:16

相關問題