von einem anderen hier answer inspiriert, habe ich eine ctypes Funktion, die ich ctypeslib.ndpointer
mit nenne:Wie kann ich mit ctypes null an eine externe Bibliothek übergeben, wobei ein Argument mit ctypeslib.ndpointer deklariert wird?
lib.foo.argtypes = [ctypeslib.ndpointer(np.complex64, ndim=1, flags='C'), POINTER(c_int)]
Die externe Funktion ist wie so erklärt:
void foo(cmplx_float *array, int *length)
Mein Problem ist, dass ich anrufen möchten die Funktion zweimal. Das erste Mal möchte ich nullptr
an das array
Argument übergeben, damit ich die erforderliche Länge herausfinden kann. Dann das zweite Mal, werde ich in einer Reihe übergeben.
So tue ich so wie folgt aus:
lib.foo(None, length)
Dies schlägt mit dem folgenden Fehler:
ctypes.ArgumentError: argument 1: : argument must be an ndarray
Ist es möglich für mich nullptr
zu passieren?
Ich bin ein wenig rostig, aber es sieht aus wie wenn Sie [erstellen Sie den Zeiger ohne Argumente] (https://docs.python.org/2/library/ctypes.html#pointers), sollte es einen Nullzeiger erstellen. –
Die wahrscheinlich sauberste Option ist die Unterklasse des von 'ctypeslib.ndpointer' zurückgegebenen Typs, der selbst eine Unterklasse von [' ctypeslib._ndptr'] ist (https://github.com/numpy/numpy/blob/v1.9.2) /numpy/ctypeslib.py#L150). Überschreiben Sie die 'from_param'-Klassenmethode, um' obj' zurückzugeben, wenn es 'None' ist, andernfalls geben Sie das Ergebnis zurück, indem Sie die' from_param'-Methode des Parents aufrufen. – eryksun
Alternativ könnten Sie 'argtypes' vorübergehend ändern, aber das gefällt mir nicht, da es nicht threadsicher ist. Sie könnten auch eine zweite Funktionszeigerinstanz erstellen, die 'argtypes = [c_void_p, POINTER (c_int)]' 'verwendet, aber zwei Funktionszeiger zu benötigen, ist schwerfällig. – eryksun