2011-12-17 10 views
12
from ctypes import * 
msvcrt = cdll.msvcrt 
message_string = "Hello world!\n" 
msvcrt.printf("Testing: %s", message_string) 

Estoy revisando un libro sobre Ctypes y Python, pero el código de ejemplo simplemente no funciona.pasando cadenas a funciones ctypes en Python 3.x

Podría ser debido a que el libro fue escrito para Python 2, mientras que estoy en Python 3?

printf solo está imprimiendo la primera letra.

+4

Proporcione más información: el mensaje de error real que recibe, otras opciones que ha probado que funcionan o no funcionan. Además, un título mejor y más descriptivo te dará más puntos de vista. – dtlussier

+0

Quizás. El código funciona bien para mí en Python 2. ¿Lo has probado? –

+1

@dtlussier No hay mensaje de error, el OP dice que printf solo imprime la primera letra. –

Respuesta

19

La función C printf está esperando cadenas de bytes. En Python 3 todas las cadenas son Unicode por lo que tendrá que codificar a bytes:

>>> msvcrt.printf("Testing: %s".encode('ascii'), message_string.encode('ascii')) 
Testing: Hello world! 
22 

Si tiene alguna caracteres no ASCII Codificar posteriormente a la página de códigos pertinentes ventanas en su lugar.

+2

Gracias! Funcionó. Literalmente no pude encontrar la respuesta en ningún lado. ¿Qué debo cambiar el nombre del título para que sea más fácil para los futuros usuarios, señor? – Edward

+0

¿Qué tal 'pasar cadenas a las funciones de ctypes en Python 3.x'? – Duncan

2

bleh, utilizando "" .encode ('ascii') es feo. A menudo puede salirse con la suya simplemente haciendo esto:

TTF_OpenFont(b"assets/droid.ttf", 10) 
      ^^ 

Tenga en cuenta el tipo 'b' para la cadena. Esto también es portátil para Python 2.7.