Domanda

Ecco l'errore.

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

Ecco il codice Python coinvolto.

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)

Ed ecco la sorgente Python coinvolti.

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);
}
È stato utile?

Soluzione

Un errore interno è chiaramente un bug in Python per sé, e se siete interessati a esplorare ulteriormente questo e offrendo una correzione per il nucleo Python, quindi semplificando il codice fino a dove si innesca ancora il bug sarebbe la strategia giusta .

Se siete più interessati ad avere il vostro lavoro di codice, piuttosto che nel fissare il nucleo di Python, allora ti suggerisco di evitare alcune delle diverse anomalie nel codice che potrebbero contribuire a confondere Python. Per esempio, non so che nessuno ha mai pensato di testare proprietà per una funzione nidificata denominata f contenente un'altra funzione ulteriormente-nested anche f chiamato - dovrebbe funzionare, ma è esattamente il tipo di cosa che non avrebbe potuto essere ben testato solo perché nessuno pensava di esso ancora, e mentre deliberatamente provocando tali anomalie è una buona strategia per rafforzando una suite di test, potrebbe essere meglio evitare se non siete deliberatamente per innescare i bug in interni di Python.

Quindi, in primo luogo, vorrei fare in modo non c'è omonimia intorno. Se che lascia ancora il bug, vorrei prossima rimuovere l'uso di oggetti di cellule da trasformando quello che attualmente sono gli accessi alle variabili non locali in "argomenti prebound", per esempio il vostro f "semi-esterno" potrebbe essere cambiamenti per cominciare:

def f(self=self):

e la tua "uno completamente interno" potrebbe diventare:

def g(req, self=self):

Questo renderebbe accessi self in una di quelle funzioni (attualmente variabile non locale accede a) nella variabile locale accessi. Sì, non si dovrebbero avere per fare questo (non ci dovrebbero essere problemi di qualsiasi software, che richiede di lavorare intorno a loro), ma purtroppo la perfezione non è una caratteristica di questo mondo sublunare, in modo che l'apprendimento di strategie bug-soluzione è un inevitabile parte della vita; -).

Altri suggerimenti

La funzione PyCell_Check controlla che la sua tesi in realtà è un oggetto cella (un tipo interno utilizzato per implementare variabili fa riferimento più ambiti). Se op non è un oggetto di cellule, si ottiene questo errore.

Il codice che hai postato non dà sufficienti contesto / informazioni per determinare esattamente come il parametro male è venuto per essere passato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top