2011-09-04 7 views
5

Estoy intentando depurar algún código que escribí, lo que implica una gran cantidad de procesos paralelos. Y tiene un comportamiento no deseado que implica salida a sys.stdout y ciertos mensajes se imprimen dos veces. Para fines de depuración, sería muy útil saber si en cierto punto sys.stdout se ha limpiado o no. Me pregunto si esto es posible y si es así, ¿cómo?Cómo saber si sys.stdout se ha eliminado en Python

Ps. No sé si importa, pero estoy usando OS X (al menos algunos comandos sys dependen del sistema operativo).

+6

Enjuagado o no, sys.stdout no le dará un orden garantizado entre procesos (y puede que ni siquiera entre subprocesos en el mismo proceso). ¿Por qué no agregar marcas de tiempo y mensajes de registro precisos por separado de cada uno o, mejor aún, hacer que todos ellos envíen mensajes de depuración a través de una cola entre procesos o entre hilos? – James

+0

El problema es que la misma salida se produce dos veces, por lo que se agregan marcas de tiempo e.t.c. realmente no ayudará. También cambiar sys.stdout a algo personalizado no ayuda, ya que esto es realmente un problema con el búfer. Si comienzo todos los procesos de python con el indicador -u, no entiendo el problema. Me gustaría saber qué está sucediendo exactamente en lugar de simplemente enrojecer después de que algo IO sucedió, ya que sería una solución fea sin entender el núcleo del problema. – koffie

Respuesta

1

La respuesta es: no se puede decir (no sin fealdad, un módulo C externo o similar).

La razón es que la implementación de archivos de python se basa en la implementación de C (stdio) para FILE *. Entonces, un objeto de archivo python subyacente básicamente tiene una referencia al FILE abierto. Al escribir datos, la implementación en C escribe datos, y cuando lo dices en flush(), python también reenvía la llamada de descarga. Entonces Python no contiene la información. Incluso para la capa C subyacente, una búsqueda rápida devolvió que no hay una API documentada que le permita acceder a esta información, sin embargo, probablemente esté en algún lugar del objeto FILE, por lo que en teoría podría leerse si fuera tan necesario.

+0

Gracias, es malo que haya tantos problemas como sea posible. Como quería saber esto solo para los temas de depuración, decidí las declaraciones de ad sys.stdout.flush() y ver si el comportamiento de mi programa cambió. Si cambió, supuse que no estaba enrojecido en ese punto. – koffie

Cuestiones relacionadas