2010-06-28 18 views
5

Espero que esto sea trivial y simplemente no lo encontré en los tutoriales. Estoy escribiendo un código python que 'supervisa' el código c, también ejecuto el código c con ctypes de python. Ahora quiero 'atrapar' las c 'printfs' para procesar los datos que salen por el código c. ¿Alguna idea de cómo uno haría esto?Cómo 'capturar' printf en python con ctypes?

Gracias

+0

¿Desea sobrecargar el C printf en Python? – luc

+0

Si está sobrecargando, ¿en qué sistema operativo? – Arlaharen

+0

Si la sobrecarga soluciona mi problema, lo intentaré. Yo uso Ubuntu 9.10. – Framester

Respuesta

0

Well printf simplemente escribe su salida a lo que el puntero de archivo se refiere a stdout. No estoy seguro de cómo está ejecutando el programa C, pero debería ser posible redirigir el stdout del programa C a algo que pueda leer en Python.

2

Puede interceptar stdout antes de escribirse desde su código C, luego procesar el valor de salida.

import sys 
import StringIO 

buffer = StringIO.StringIO() 

# redirect stdout to a buffer 
sys.stdout = buffer 

# call the c code with ctypes 
# process the buffer 

# recover the old stdout 
sys.stdout = sys.__stdout__ 

Sin embargo, sería más fácil y más agradable para pasar un buffer para el código C, y en vez de printf -ing los valores de salida se escribirían en el tampón proporcionado.

O, mejor aún, usted podría pasar un byrefc_char_p, asignar memoria para que dentro del código C, actualizar la memoria intermedia con el valor de salida a continuación, utilizar el tampón en el Python. No olvide desasignar la memoria (debe crear un contenedor ctypes para la función free).

+0

La intercepción de 'stdout' es lo que tenía en mente. Pero no funciona para mí. El código no cambia el comportamiento de salida. – Framester

+0

Realmente no entiendo lo que quiere decir con * el código no cambia el comportamiento de salida *. Proporcionar una explicación más detallada de lo que está tratando de lograr y los problemas que encuentra con la redirección 'stdout' puede darnos una pista sobre cómo podemos ayudarlo. –

+0

Perdón por no haber sido lo suficientemente claro. Agregué las líneas de código para interceptar el 'stdout', pero el 'printfs' de las funciones c que invoco con ctypes en Python todavía se emite en el terminal. Agregaré una descripción más concreta de mi problema en la respuesta. – Framester

Cuestiones relacionadas