2011-08-31 10 views
11

Tengo un programa en funcionamiento de Python 2.7 que llama a una DLL. Estoy tratando de portar el script a Python 3.2. La llamada DLL parece funcionar (es decir, no hay ningún error al llamar) pero los datos devueltos no tienen sentido.Diferencias en ctypes entre Python 2 y 3

Por si acaso podría ser útil: - La llamada toma tres argumentos: dos int (entrada) y un puntero a una matriz ushort (salida).

He intentado utilizar matrices python y numpy sin éxito.

¿Alguien puede enumerar las diferencias entre Python 2.7 y 3.2 respetando ctypes?

Gracias de antemano

EDITAR

Aquí es un código de ejemplo. La DLL es propietaria, así que no tengo el código. Pero tengo la cabecera C:

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

El código Python es:

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) 

Esto funciona en Python 2.7, pero no en 3.2.

EDIT 2

Si los cambios en ctypes sólo aquellos señalado por Cedric son, no tiene sentido que Python 3.2 no funcionará. Entonces volviendo a mirar el código, descubrí que hay una función de preparación llamada antes de la función que menciono. La firma es:

void prepare(char *table) 

en Python, llamo por:

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

¿Es posible que el problema se debe al cambio en el manejo de cadenas de Python?

+1

No estoy al tanto de cualquier diferencia en absoluto. Creo que necesitaríamos ver algún código. –

Respuesta

14

En Python 2.7, las cadenas son cadenas de bytes por defecto. En Python 3.x, son unicode por defecto.Intente hacer explícitamente que su cadena sea una cadena de bytes usando .encode('ascii') antes de entregarla al DLL.prepare.

Editar:

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

¡Varios años después, esta respuesta es muy útil! También tuve un problema en el que estaba usando una antigua biblioteca de Python en Python3 y no podía entender por qué el código no funcionaba. Después de cambiar las cadenas que paso a la biblioteca compartida para ser ascii, ¡todo funcionó bien! –

0

Según la documentación pitón, los únicos cambios entre 2,7 y 3,2

Un nuevo tipo, ctypes.c_ssize_t representa el tipo de datos C ssize_t.

En 2.7, hubo alguna otra modifications introduced:

El módulo ctypes ahora siempre convierte Ninguno a un puntero NULL para C argumentos declaradas como punteros. (Modificado por Thomas Heller; número 4606.) La biblioteca libffi subyacente se ha actualizado a la versión 3.0.9, que contiene varias correcciones para diferentes plataformas. (Actualizado por Matthias Klose; issue 8142.)

No estoy seguro de que va a explicar la causa de su problema ...

Cuestiones relacionadas