2012-07-25 13 views
5

Ejecuto Eclipse con PyDev y Python 3.2 en Windows Vista y estaba trabajando en un tutorial sobre Python y ctypes.Eclipse y Python 3: ¿por qué se imprime printf() desde ctypes en la salida de la consola después de las instrucciones print() siguientes

Sin embargo, descubrí que cuando llamo a msvcrt.printf() para imprimir una cadena, esto no se muestra en la salida de la consola para Eclipse hasta que se muestren todas las demás declaraciones de impresión.

Aquí es el código exacto que utilizo:

from ctypes import * 

msvcrt = cdll.msvcrt 
message_string = "Hello Worlds!\n" 

printf = msvcrt.printf 
print(printf("Testing: %s".encode('ascii'),message_string.encode('ascii'))) 


print("foo") 

print("why!?") 

y aquí está la salida:

23 
foo 
why!? 
Testing: Hello Worlds! 

Las únicas explicaciones que he visto en otro lugar (para C en general) mencionan cómo se almacena temporalmente printf y necesita una nueva línea antes de mostrar, pero hay una nueva línea en la cadena, y también agregué una directamente a la declaración de printf ('printf (' Prueba:% s \ n ", ... ') y no hizo ninguna diferencia.

Quiero trabajar en Eclipse, no quiero tener que seguir abriendo un símbolo del sistema cada vez que quiero probar scripts, entonces, ¿hay alguna forma de que pueda solucionar este pedido en la salida de la consola? ¿Y por qué pasa esto?

Respuesta

0

Aunque esto no responde a su pregunta, pero printf está devolviendo 23 que es el número de caracteres impresos, puede reemplazarlo por sprintf y devolverá la cadena y se mostrará en la consola en el orden correcto.

Sin embargo, no veo una razón para usar mscvcrt's printf cuando puede hacer lo mismo con python.

+0

Estaba siguiendo un tutorial sobre ctypes, que me plan para usar para funciones que no sean printf más tarde. La razón por la que quería entender esto y hacer que funcione es porque si no puedo entender lo que está sucediendo con esta simple tarea, ¿cómo puedo esperar comprender las más complejas? – Brian

1

Si la biblioteca estándar C piensa que stdout está conectado a un archivo o una tubería en lugar de a una consola, bloqueará su salida. Puede solucionar esto mediante la emisión de una fflush después printf:

msvcrt.fflush(msvcrt.stdout) 

También puede ser capaz de forzar stdout en la no-amortiguada modo:

msvcrt.setvbuf(msvcrt.stdout, None, _IONBF, 0) 
+0

Gracias por la explicación, pero en cuanto a las correcciones, aparece este error: "AttributeError: función 'stdout' no encontrada" – Brian

+0

Obtener un puntero a stdout desde msvcrt podría ser bastante difícil; ver http://osdir.com/ml/python.ctypes/2005-09/msg00019.html – ecatmur

Cuestiones relacionadas