J'utilise ctypes pour interopérer entre C et Python + numpy. Le code des deux côtés est écrit par moi. Habituellement, cela fonctionne comme prévu, mais j'ai rencontré un bug bizarre que je ne comprends pas.numpy et ctypes: traiter des vues
Ma question est: que se passe-t-il?
Je travaille sur Linux (Manjaro 16.10), avec gcc 6.2.1. python 2.7.12 et numpy 1.11.2.
Une version simplifiée de mon code C:
void imp(double *M) {/*do stuff, assumes M is a 3x3 row-major matrix*/}
Une version simplifiée de mon code Python:
lib = ctypes.CDLL('path/to/lib.so')
def function(M):
assert(M.dtype == np.float64)
lib.imp(M.ctypes.data_as(ctypes.POINTER(ctypes.c_double)))
# Snippet 1: Doesn't work correctly, gives nonsense results.
print my_var.dtype # prints 'float64'
print my_var.shape # prints '(3, 3)'
function(my_var) # the assert in function doesn't fail
# Snippet 2: Works correctly, gives the expected results.
my_var = my_var.astype(np.float64) # (!!)
print my_var.dtype # The same...
print my_var.shape # ...as in...
function(my_var) # ...snippet 1
MISE À JOUR
Remplacement
my_var = my_var.astype(np.float64)
avec
my_var = my_var.copy()
fonctionne tout aussi bien. Apparemment, la source du problème est le fait que my_var est une vue de numpy (j'ai vérifié cela en imprimant my_var.base). Donc, ma question révisée est la suivante: quelle est la bonne façon de passer des tableaux numpy avec ctype, si ces tableaux peuvent être des vues? Est-ce que copier tous les arguments avant d'appeler une fonction c est inévitable?