Что вы делаете с этой ошибкой Python? - PullRequest
2 голосов
/ 22 августа 2009

Вот ошибка.

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);
}

Ответы [ 2 ]

6 голосов
/ 22 августа 2009

Внутренняя ошибка - это явно ошибка в самом Python, и если вы заинтересованы в дальнейшем изучении этого вопроса и предложении исправления для ядра Python, то упрощение кода до места, где он по-прежнему вызывает ошибку, будет правильной стратегией. .

Если вы больше заинтересованы в том, чтобы ваш код работал, а не исправлял ядро ​​Python, тогда я предлагаю вам избежать некоторых из нескольких аномалий в вашем коде, которые могут привести к путанице в Python. Например, я не знаю, чтобы кто-либо когда-либо думал проверять свойство для вложенной функции с именем f, содержащей еще одну вложенную функцию также с именем f - это ДОЛЖНО работать, но это точно такого рода вещи, которые, возможно, не были хорошо проверены только потому, что никто еще не думал об этом, и хотя намеренное провоцирование таких аномалий является очень хорошей стратегией для усиления набора тестов, лучше всего этого избежать, если вы намеренно не ошибки в внутренностях Python.

Итак, во-первых, я бы убедился, что вокруг нет омонимии. Если это по-прежнему оставляет ошибку, я бы затем удалил использование объектов ячеек, превратив то, что в настоящее время является доступом к нелокальным переменным, в «предварительные аргументы», например, ваш «полу-внешний» f может быть изменен для начала: 1010 *

def f(self=self):

и ваш «полностью внутренний» может стать:

def g(req, self=self):

Это сделает доступ к self в любой из этих функций (в настоящее время доступ к нелокальной переменной) в доступ к локальной переменной. Да, вам не нужно этого делать (в любом программном обеспечении не должно быть ошибок, требующих обхода), но, увы, совершенство не характерно для этого подлунного мира, так что изучение стратегий обхода ошибок неизбежно часть жизни; -).

2 голосов
/ 22 августа 2009

Функция PyCell_Check проверяет, является ли ее аргумент объектом ячейки (внутренний тип, используемый для реализации переменных, на которые ссылаются несколько областей). Если op не является ячейкой, вы получите эту ошибку.

Код, который вы опубликовали, не дает достаточно контекста / информации, чтобы точно определить, как произошла передача неверного параметра.

...