Frage

Hier ist der Fehler.

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

Hier ist der Python-Code beteiligt.

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)

Und hier ist die Python Quelle beteiligt.

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);
}
War es hilfreich?

Lösung

Ein interner Fehler ist eindeutig ein Fehler in Python selbst, und wenn Sie daran interessiert sind, dies weiter zu erforschen und ein Update für den Python-Kern bietet, dann Ihren Code vereinfacht nach unten, wo es immer noch dem Fehler auslöst, wäre die richtige Strategie sein .

Wenn Sie mehr daran interessiert sind Ihre Code Arbeit in mit, anstatt in den Python-Kernfixierungs, dann empfehle ich Ihnen einige der verschiedenen Anomalien in Ihrem Code zu vermeiden, die Python zu verwirrend beitragen könnten. Zum Beispiel weiß ich nicht, dass irgendjemand jemals Eigenschaft gedacht zu testen für eine verschachtelte Funktion namens f enthält noch eine weitere weitere verschachtelte Funktion auch genannt f - es sollte funktionieren, aber es ist genau die Art von Sache, die einfach nicht gut getestet worden könnte, weil niemand daran gedacht noch, und während absichtlich solche Anomalien ist für stärk eine Reihe von Tests eine sehr gute Strategie zu provozieren, könnte es am besten vermieden werden, wenn Sie nicht bewusst aus sind auslösen Fehler in Python-Interna.

Also, zuerst würde ich sicherstellen, dass es um keine homonimy. Wenn das immer noch den Fehler verlässt, würde ich als nächstes die Verwendung von Zellobjekte entfernen, indem, was zur Zeit Zugriffe auf nicht-lokale Variablen in „Prebound Argumente“ sind zum Beispiel Ihre „semi-Außen“ f könnten Veränderungen beginnen mit:

def f(self=self):

und Ihre „voll inneren“ könnte werden:

def g(req, self=self):

Dies würde greift in eine dieser beiden Funktionen (zur Zeit nicht lokale Variable zugreift) in lokalen Variable Zugriffe auf self. Ja, man sollte dies nicht zu tun hat (es sollte keine Fehler in jeder Software sein, dass erfordert, dass Sie um sie herum zu arbeiten), aber leider Perfektion ist kein Merkmal dieser sublunar Welt, so dass Lernstrategien Bug-Umgehung ein unvermeidlichen ist Teil des Lebens, -).

Andere Tipps

Die PyCell_Check Funktion überprüft, ob ihr Argument tatsächlich ein Zellobjekt ist (ein interner Typ verwendeten Variablen durch mehrere Bereiche verwiesen zu implementieren). Wenn op kein Zellobjekt ist, würden Sie diese Fehlermeldung erhalten.

Der Code, den Sie nicht gepostet nicht genug Kontext / Informationen geben, genau zu bestimmen, wie die schlechten Parameter übergeben werden kamen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top