Ispirato da un altro answer qui, ho una funzione ctypes che io chiamo utilizzando ctypeslib.ndpointer
:Come posso passare null a una libreria esterna, usando i ctypes, con un argomento dichiarato con ctypeslib.ndpointer?
lib.foo.argtypes = [ctypeslib.ndpointer(np.complex64, ndim=1, flags='C'), POINTER(c_int)]
La funzione esterna è dichiarata in questo modo:
void foo(cmplx_float *array, int *length)
mio problema è che io voglio chiamare la funzione due volte. La prima volta voglio passare nullptr
all'argomento array
, in modo che possa trovare la lunghezza richiesta. Poi la seconda volta, passerò in una serie numpy.
Così lo faccio in questo modo:
lib.foo(None, length)
Questo non riesce con il seguente errore:
ctypes.ArgumentError: argument 1: : argument must be an ndarray
E 'possibile per me di passare nullptr
?
Sono un po' arrugginito su 'ctypes', ma sembra che se tu [crea il puntatore senza argomenti] (https://docs.python.org/2/library/ctypes.html#pointers), dovrebbe creare un puntatore nullo. –
Probabilmente l'opzione più pulita è quella di sottoclasse del tipo restituito da 'ctypeslib.ndpointer', che a sua volta è una sottoclasse di [' ctypeslib._ndptr'] (https://github.com/numpy/numpy/blob/v1.9.2 /numpy/ctypeslib.py#L150). Sovrascrivi il suo metodo di classe 'from_param' per restituire' obj' se è 'None', altrimenti restituisce il risultato della chiamata al metodo' from_param' del genitore. – eryksun
In alternativa è possibile modificare temporaneamente 'argtypes', ma non mi piace perché non è thread-safe. È anche possibile creare una seconda istanza del puntatore a funzione che utilizza 'argtypes = [c_void_p, POINTER (c_int)]', ma che richiede due puntatori di funzione è maldestro. – eryksun