¿Qué piensa de este error de Python?
Pregunta
Aquí está el error.
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
Este es el código Python involucrado.
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)
Y aquí está la fuente de Python en cuestión.
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);
}
Solución
Un error interno es claramente un error en sí mismo Python, y si usted está interesado en explorar aún más este y ofreciendo una solución para el núcleo de Python, a continuación, simplificando su código hasta donde todavía provoca el error sería la estrategia correcta .
Si usted está más interesado en que su código de trabajo, en lugar de en la fijación del núcleo de Python, entonces le sugiero que evitar algunas de las varias anomalías en el código que pueden estar contribuyendo a confundir Python. Por ejemplo, no sé que nadie pensó nunca para probar la propiedad de una función anidada llamada f
contiene otra función adicional anidada también llamado f
- que debería funcionar, pero es exactamente el tipo de cosa que no podría haber sido bien probado simplemente porque nadie pensó en ello, sin embargo, y al mismo tiempo provocar deliberadamente este tipo de anomalías es una muy buena estrategia para fortaleciendo una serie de pruebas, podría ser mejor evitar si no está deliberadamente para provocar errores en internos de Python.
Por lo tanto, en primer lugar, me aseguraría de que no hay homonimy alrededor. Si eso todavía deja el error, me quito siguiente, el uso de objetos de la célula girando lo que actualmente son los accesos a las variables no locales en "argumentos prebound", por ejemplo, su f
"semi-exterior" podría haber cambios para empezar:
def f(self=self):
y su "uno totalmente interno" podría convertirse en:
def g(req, self=self):
Esto haría que accede a self
en cualquiera de esas funciones (actualmente la variable no local tiene acceso) en los accesos variable local. Sí, usted no debería tener que hacer esto (no debe haber errores en el software, que requiere que trabajar alrededor de ellos), pero por desgracia la perfección no es una característica de este mundo sublunar, por lo que el aprendizaje de estrategias de bug-solución es inevitable parte de la vida; -).
Otros consejos
La función PyCell_Check
comprueba que su argumento en realidad es un objeto de celda (un tipo interno utilizado para implementar las variables referenciados por múltiples alcances). Si op
no es un objeto de celda, se llega a este error.
El código que envió no le da suficiente contexto / información para determinar exactamente cómo el parámetro incorrecto llegó a ser pasado.