質問

これがエラーです。

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);
}
役に立ちましたか?

解決

内部エラーは明らかに Python 自体のバグであり、これをさらに調査して Python コアの修正を提供することに興味がある場合は、バグの原因となる部分までコードを簡素化することが正しい戦略となるでしょう。

Python コアを修正することよりも、コードを動作させることに興味がある場合は、Python を混乱させる原因となる可能性のあるコード内のいくつかの異常を回避することをお勧めします。たとえば、ネストされた関数のプロパティをテストしようと考えた人がいるかどうかは知りません。 f さらに別のネストされた関数を含む また 名前付き f -- これは機能するはずですが、これはまさに、まだ誰も思いつかないという理由で十分にテストされていない可能性がある種類のものであり、意図的にそのような異常を引き起こすことは一連のテストを強化するための非常に良い戦略ですが、それが最善かもしれません意図的に Python の内部でバグを引き起こそうとしない場合は避けてください。

そこで、まず同性愛が存在しないことを確認します。それでもバグが残る場合は、次に、現在非ローカル変数にアクセスしているものを「事前バインド引数」、たとえば「半外部」に変更することで、セル オブジェクトの使用を削除します。 f まずは以下のような変更が考えられます:

def f(self=self):

そして、あなたの「完全に内なる人」は次のようになります。

def g(req, self=self):

これにより、次の場所にアクセスできるようになります。 self これらの関数のいずれか (現在は非ローカル変数アクセス) をローカル変数アクセスに変更します。はい、これを行う必要はありません (どのソフトウェアにも、バグを回避する必要があるようなバグがあってはなりません)。しかし、悲しいことに完璧さはこの月下の世界の特徴ではないため、バグ回避戦略を学ぶことは避けられません。人生の一部;-)。

他のヒント

PyCell_Check関数は、その引数が実際にセルオブジェクト(複数のスコープで参照される変数を実装するために使用される内部型)であることをチェックします。 opがセルオブジェクトでない場合は、このエラーになるだろう。

あなたが投稿したコードが悪いのパラメータが渡されるようになった方法を正確に判定するのに十分な文脈/情報を与えるものではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top