문제

여기 오류가 있습니다.

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

여기에 관련된 파이썬 코드가 있습니다.

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)

그리고 여기에 관련된 파이썬 소스가 있습니다.

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);
}
도움이 되었습니까?

해결책

내부 오류는 분명히 파이썬 자체의 버그이며,이를 더 자세히 탐색하고 파이썬 코어에 대한 수정을 제공하는 데 관심이 있다면 코드를 여전히 트리거하는 위치로 코드를 단순화하는 것이 올바른 전략이 될 것입니다.

Python Core를 수정하는 대신 코드 작업을하는 데 더 관심이 있다면, 코드의 여러 이상을 피한 피스톤에 기여할 수있는 몇 가지 이상을 피하는 것이 좋습니다. 예 를생 f 또 다른 네트워크 기능을 포함합니다 또한 명명 된 f - 작동해야하지만 아직 아무도 생각하지 않았기 때문에 잘 테스트되지 않았을 수도있는 종류이며, 의도적으로 그러한 변칙을 자극하는 것은 테스트 한 제품군을 강화하는 데 매우 좋은 전략이지만 가장 좋은 것일 수 있습니다. Python의 내부에서 버그를 유발하지 않으면 의도적으로 나가지 않으면 피하십시오.

먼저, 나는 주위에 호모니 메이가 없는지 확인할 것입니다. 그것이 여전히 버그를 남기면, 다음으로 현재 비 국소 변수에 액세스하고있는 내용을 "사전 바운드 인수", 예를 들어 "세미 outer"로 바꾸어 셀 객체의 사용을 제거합니다. f 시작할 변경이 될 수 있습니다.

def f(self=self):

그리고 당신의 "완전한 하나"는 다음과 같습니다.

def g(req, self=self):

이것은 액세스 할 것입니다 self 이러한 함수 중 어느 하나에서 (현재 비 국한 변수 액세스)에서 로컬 변수 액세스에 대한. 그렇습니다.이 작업을 수행 할 필요는 없습니다 (소프트웨어에는 버그가 없어야합니다. 주변에서 작업 해야하는 버그가 없어야합니다). 그러나 Alas Perfection 은이 하위 노르 세계의 특징이 아니므로 버그 작업 전략을 배우는 것은 피할 수 없습니다. 삶의 일부 ;-).

다른 팁

그만큼 PyCell_Check 함수는 인수가 실제로 셀 객체 (여러 범위에서 참조 된 변수를 구현하는 데 사용되는 내부 유형)인지 확인합니다. 만약에 op 셀 객체가 아니므 로이 오류가 발생합니다.

게시 한 코드는 잘못된 매개 변수가 어떻게 통과되는지 정확히 결정하기에 충분한 컨텍스트/정보를 제공하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top