2009-12-24 5 views
5

Si tengo un programa donde se redirige stdout, mi pdb solicita que todos vayan a la redirección, porque la biblioteca se escribió para escribir en stdout.¿la mejor manera de lidiar con python pdb flakiness re/stdout?

A menudo, este problema es sutil, lo que me hace pensar que un programa se cuelga cuando realmente está esperando la entrada.

¿Cómo funciona la gente al respecto? (Desafortunadamente, usar otros depuradores como winpdb no es una opción).

Respuesta

2

el problema aquí es que el AP utiliza la clase Cmd, donde por defecto:

use_rawinput = 1 

Significa que Cmd utilizará el método raw_input() de manera predeterminada en lugar de sys.stdout.readline() para leer desde la consola. Esto se hace porque raw_input() admite el historial (solo si se carga el módulo readline) y otros bits útiles. El único problema es que raw_input() no admite la redirección, por lo que si usted tiene un script:

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

y ejecutarlo

> python test.py 
Enter your name: Alex 

pero, si se ejecuta con la redirección de la salida que va pegado

> python test.py | tee log 

esto es exactamente lo que utiliza PDB y por qué está atascado también. Como mencioné sys.stdin.readline() admite la redirección y si reescribe el script anterior usando readline() debería funcionar.

Volver a la emisión original todo lo que necesita hacer es decirle Cmd a no utilizar raw_input():

Cmd.use_rawinput = 0 

o

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

Si está invocando pdb en el código, puede pasar su propia stdout en el constructor. sys.__stdout__ podría ser una buena opción.

Si está invocando pdb desde la línea de comandos, puede copiar la función main() de pdb.py en su propia sane_pdb.py. A continuación, cambiar la inicialización PDB() a:

pdb = Pdb(stdout=sys.__stdout__) 

entonces puede invocar sane_pdb.py en lugar de pdb.py. No es asombroso que tengas que copiar 40 líneas en tu propio archivo solo para cambiar una de ellas, pero es una opción.

4

Esta respuesta es simplemente para complementar Ned, como una manera de envolver la función pdb.py main() de una manera que no requiere la copia de 40 líneas sólo para cambiar uno de ellos:

# 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() 

Pongo sé si realmente funciona para el problema del que pregunta, pero sí lo describió Ned ...

Cuestiones relacionadas