que - Diferencias en ctypes entre Python 2 y 3
que version de python debo instalar (2)
Tengo un programa en funcionamiento de Python 2.7 que llama a un 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.
En caso de que pueda ser útil: - La llamada toma tres argumentos: dos int (entrada) y un puntero a una matriz ushort (salida).
He intentado usar matrices python y numpy sin éxito.
¿Alguien puede enumerar las diferencias entre Python 2.7 y 3.2 respetando ctypes?
Gracias por adelantado
EDITAR
Aquí hay un código de ejemplo. La DLL es propietaria, así que no tengo el código. Pero tengo el encabezado 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 son solo los señalados por Cedric, no tiene sentido que Python 3.2 no funcione. 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, estoy llamando por:
table = str(aNumber)
DLL.prepare(table)
¿Es posible que el problema se deba al cambio en el manejo de cadenas de Python?
De acuerdo con la documentación de Python, los únicos cambios entre 2.7 y 3.2 están aquí
Un tipo nuevo, ctypes.c_ssize_t representa el tipo de datos C ssize_t.
En 2.7, se introdujeron algunas otras modificaciones :
El módulo ctypes ahora siempre convierte None en un puntero C NULL para los argumentos declarados como punteros. (Modificado por Thomas Heller; número 4606.) La biblioteca subyacente de libffi se ha actualizado a la versión 3.0.9, que contiene varias correcciones para diferentes plataformas. (Actualizado por Matthias Klose; número 8142.)
No estoy seguro de que explique la causa de tu problema ...
En Python 2.7, las cadenas son byte-strings 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 entregarlo a DLL.prepare
.
Editar:
#another way of saying table=str(aNumber).encode(''ascii'')
table = bytes(str(aNumber), ''ascii'')
DLL.prepare(table)