题
这里的误差。
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);
}
解决方案
这是内部错误显然是Python本身的错误,如果你有兴趣进一步探讨这一点,并提供修复的Python的核心,然后简化你的代码到它仍然触发错误将是正确的策略
如果你更感兴趣的是有你的代码的工作,而不是在固定的Python的核心,那么我建议你避免一些在你的代码中的一些异常现象,可能是导致混乱的Python。例如,我不知道,任何人都没有想过名为f
嵌套函数包含又一进一步嵌套函数同时命名f
测试性能 - 它应该工作,但正是那种可能没有得到很好的,只是因为没有人想到这一点还没有测试,而蓄意挑衅这种异常是一个 - 加强套件的测试,一个非常好的策略的东西,它可能是最好的,如果你不是故意出引发错误的回避Python的内部结构。
所以,首先,我会确保有周围没有homonimy。如果仍有错误,我接下来会通过旋转取下使用电池的对象是什么目前是访问非本地变量分为“预绑定的参数”,例如你的“半外” f
可以改变开始:
def f(self=self):
和你的“全内一个”可能变成:
def g(req, self=self):
这将使访问中的任一种的那些功能(目前非局部变量访问)到局部变量访问self
。是的,你不应该这样做(应该在任何软件没有错误,需要你解决它们),但可惜完美是不是这个sublunar世界的特征,使学习bug的解决方法策略是必然的生活的一部分; - 。)
其他提示
在PyCell_Check
函数检查其参数实际上是一个单元对象(一个内部类型用于实现由多个范围引用的变量)。如果op
不是一个单元对象,你会得到这个错误。
您发布的代码没有给出足够的上下文/信息,以确定到底坏参数如何被传递。
不隶属于 StackOverflow