2011-08-31 16 views
11

Ho un programma Python 2.7 funzionante che chiama una DLL. Sto provando a portare lo script in Python 3.2. La chiamata DLL sembra funzionare (cioè non c'è nessun errore durante la chiamata) ma i dati restituiti non hanno senso.Differenze nei ctypes tra Python 2 e 3

Nel caso in cui potrebbe essere utile: - La chiamata accetta tre argomenti: due int (input) e un puntatore a un array ushort (output).

Ho provato ad utilizzare entrambi gli array Python e Numpy senza successo.

Qualcuno può enumerare le differenze tra Python 2.7 e 3.2 rispetto ai ctype?

Grazie in anticipo

EDIT

Ecco qualche esempio di codice. La DLL è propietary quindi non ho il codice. Ma ho l'intestazione C:

void example (int width, int height, unsigned short* pointer) 

Il codice python è:

width, height = 40, 100 
imagearray = np.zeros((width,height), dtype=np.dtype(np.ushort)) 
image = np.ascontiguousarray(imagearray) 
ptrimage = image.ctypes.data_as(ct.POINTER(ct.c_ushort)) 
DLL.example(width, height, ptrimage) 

Questo funziona in Python 2.7, ma non in 3.2.

EDIT 2

Se le modifiche in ctypes sono solo quelle sottolineato da Cedric, che non ha senso che Python 3.2 non funzionerà. Quindi, guardando di nuovo il codice, ho scoperto che esiste una funzione di preparazione chiamata prima della funzione che sto menzionando. La firma è:

void prepare(char *table) 

in Python, sto chiamando da:

table = str(aNumber) 
DLL.prepare(table) 

E 'possibile che il problema è dovuto al cambiamento nella gestione di stringhe Python?

+1

io non sono a conoscenza di eventuali differenze a tutti. Penso che dovremmo vedere un po 'di codice. –

risposta

14

In Python 2.7, le stringhe sono byte-stringhe per impostazione predefinita. In Python 3.x, sono unicode per impostazione predefinita.Prova a rendere esplicita la stringa una stringa di byte utilizzando .encode('ascii') prima di passarla a DLL.prepare.

Edit:

#another way of saying table=str(aNumber).encode('ascii') 
table = bytes(str(aNumber), 'ascii') 
DLL.prepare(table) 
+1

Diversi anni dopo, questa risposta è molto utile! Ho anche avuto un problema in cui stavo usando una vecchia libreria Python in Python3 e non riuscivo a capire perché il codice non funzionava. Dopo aver cambiato le stringhe, passo alla libreria condivisa per essere ascii, tutto ha funzionato bene! –

0

base alla documentazione pitone, le uniche modifiche tra 2,7 e 3,2

Un nuovo tipo, ctypes.c_ssize_t rappresenta il tipo di dati C ssize_t.

In 2.7, c'era qualche altra modifications introduced:

Il modulo ctypes ora converte sempre Nessuno per un puntatore C NULL per argomenti dichiarati come puntatori. (Modificato da Thomas Heller; numero 4606.) La libreria libffi sottostante è stata aggiornata alla versione 3.0.9, contenente varie correzioni per piattaforme diverse. (Aggiornato da Matthias Klose; numero 8142.)

Io non sono sicuro che sarà spiegare la causa del problema ...

Problemi correlati