2011-09-04 17 views
5

Sto provando a eseguire il debug del codice che ho scritto, che implica molti processi paralleli. E avere alcuni comportamenti indesiderati che coinvolgono l'output a sys.stdout e alcuni messaggi vengono stampati due volte. Ai fini del debug, sarebbe molto utile sapere se ad un certo punto sys.stdout è stato svuotato o meno. Mi chiedo se sia possibile e se sì, come?Come sapere se sys.stdout è stato svuotato in Python

Ps. Non so se è importante, ma sto usando OS X (almeno alcuni comandi di sys dipendono dal sistema operativo).

+6

Svuotato o meno, sys.stdout non ti darà l'ordine garantito tra i processi (e potrebbe non essere nemmeno tra i thread nello stesso processo). Perché non aggiungere timestamp accurati e registrare i messaggi separatamente da ciascuno di essi, o, ancora meglio, tutti hanno inviato messaggi di debug tramite una coda di thread o di interprocesso? – James

+0

Il problema è che lo stesso output si verifica due volte, quindi aggiungere timestamp e.t.c. non sarà di grande aiuto. Anche cambiare sys.stdout in qualcosa di personalizzato non aiuta poiché questo è davvero un problema con il buffer. Se avvio tutti i processi Python coinvolti con il flag -u, non ho il problema. Vorrei sapere che cosa sta succedendo esattamente, invece di arrossire sempre dopo che un IO è passato, poiché sarebbe stata una brutta soluzione senza comprendere il nocciolo del problema. – koffie

risposta

1

La risposta è: non si può dire (non senza brutto brutto, un modulo C esterno o simile).

Il motivo è che l'implementazione dei file di Python si basa sull'implementazione C (stdio) per FILE *. Quindi un oggetto file python sottostante ha semplicemente un riferimento allo FILE aperto. Durante la scrittura dei dati, l'implementazione C scrive i dati e quando lo comunichi a flush() python inoltra semplicemente la chiamata a filo. Quindi python non conserva le informazioni. Anche per il livello C sottostante, una ricerca rapida ha restituito che non vi è alcuna API documentata che ti permetta di accedere a queste informazioni, tuttavia è probabilmente da qualche parte nell'oggetto FILE, quindi in teoria potrebbe essere letta se è disperatamente necessario.

+0

Grazie, a male che è così tanto disturbo se possibile a tutti. Dato che volevo sapere questo solo per i debug pruposes, ho appena deciso di inserire ad sys.stdout.flush() le istruzioni e vedere se il comportamento del mio programma è cambiato. Se fosse cambiato, ho pensato che non fosse stato lavato a quel punto. – koffie

Problemi correlati