2009-12-24 10 views
5

Se ho un programma in cui è stato reindirizzato stdout, il mio pdb richiede di andare al reindirizzamento, perché la libreria è stata scritta per scrivere su stdout.il modo migliore per gestire pyd/pdb flakiness re/stdout?

Spesso questo problema è impercettibile, inducendomi a pensare che un programma sia sospeso quando è davvero in attesa di input.

Come funzionano le persone intorno a questo? (Sfortunatamente, usare altri debugger come winpdb non è un'opzione).

risposta

2

il problema qui è che PDB utilizza classe Cmd dove per impostazione predefinita:

use_rawinput = 1 

Significa che Cmd utilizzerà il metodo raw_input() per impostazione predefinita anziché sys.stdout.readline() per leggere dalla console. Questo perché raw_input() supporta la cronologia (solo se il modulo readline è caricato) e altri bit utili. L'unico problema è che raw_input() non supporta il reindirizzamento, quindi se si dispone di uno script:

#!/usr/bin/python 
name=raw_input("Enter your name: ") 

ed eseguirlo

> python test.py 
Enter your name: Alex 

ma, se lo si esegue con reindirizzamento uscita sarà bloccato

> python test.py | tee log 

questo è esattamente ciò che il PDB utilizza e perché è bloccato. Come ho detto, sys.stdin.readline() supporta il reindirizzamento e se si riscrive lo script sopra usando readline(), dovrebbe funzionare.

Torna il problema originale tutto quello che dovete fare è dire Cmd non utilizzare raw_input():

Cmd.use_rawinput = 0 

o

pdb = pdb.Pdb() 
pdb.use_rawinput=0 
pdb.set_trace() 
2

Se si sta invocando pdb nel codice, è possibile passare il proprio stdout nel costruttore. sys.__stdout__ potrebbe essere una buona scelta.

Se si richiama pdb dalla riga di comando, è possibile copiare la funzione main() da pdb.py nel proprio sane_pdb.py. Quindi modificare l'inizializzazione PDB() a:

pdb = Pdb(stdout=sys.__stdout__) 

Quindi è possibile richiamare sane_pdb.py invece di pdb.py. Non è fantastico che tu debba copiare 40 righe nel tuo file solo per cambiarne una, ma è un'opzione.

4

Questa risposta è solo per integrare Ned, come un modo di avvolgere la funzione pdb.py main() in un modo che non richiede la copia di 40 righe solo per cambiare uno di loro:

# sane_pdb.py: launch Pdb with stdout on original 
import sys, pdb 
def fixed_pdb(Pdb=pdb.Pdb): 
    '''make Pdb() tied to original stdout''' 
    return Pdb(stdout=sys.__stdout__) 

if __name__ == '__main__': 
    pdb.Pdb = fixed_pdb 
    pdb.main() 

I don 't sapere se effettivamente funziona per il problema del interlocutore, ma fa quello Ned descritto ...

Problemi correlati