versiones que python3 python2 print mejores instalar entre empezar differences diferencias debo con cambios python dll numpy python-3.x ctypes

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)