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);
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top