你对这个Python错误有什么看法?

时间:2009-08-22 08:10:58

标签: python ctypes

这是错误。

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);
}

2 个答案:

答案 0 :(得分:6)

内部错误显然是Python本身的一个错误,如果您有兴趣进一步探索这个并为Python核心提供修复,那么将代码简化到仍然触发错误的地方将是正确的策略

如果您对代码更有兴趣,而不是修复Python内核,那么我建议您避免代码中可能导致混淆Python的一些异常现象。例如,我不知道有没有人想过为一个名为f的嵌套函数测试属性,该函数包含另一个进一步嵌套的函数命名为f - 它应该是应该的工作,但它正是那种可能没有经过充分测试的东西,因为没有人想到它,虽然故意挑起这样的异常是加强一系列测试的一个非常好的策略,但最好避免,如果你'不要故意在Python的内部触发错误。

所以,首先,我会确保周围没有同性恋。如果仍然存在错误,我接下来会通过将当前访问非本地变量的内容转换为“预绑定参数”来删除单元格对象的使用,例如,您的“半外部”f可能会更改为以:

def f(self=self):

你的“完全内在的”可能会成为:

def g(req, self=self):

这将使这些函数(当前非局部变量访问)中的self访问本地变量访问。是的,你不应该这样做(任何软件都应该没有错误,这需要你解决它们),但唉完美并不是这个子世界的特征,因此学习错误解决方案策略是不可避免的生活的一部分; - )。

答案 1 :(得分:2)

PyCell_Check函数检查其参数实际上是一个单元格对象(用于实现多个范围引用的变量的内部类型)。如果op不是单元格对象,则会出现此错误。

您发布的代码没有提供足够的上下文/信息来确定错误参数的确切传递方式。