2012-02-07 15 views
25

Tengo un script de python que lee stdin a través de un conducto, y no puedo usarlo con pdb.set_trace().Use pdb.set_trace() en un script que lea stdin a través de un conducto

my_script.py:

#!/usr/bin/env python 
import sys 
import pdb 

def main(): 
    for line in sys.stdin: 
     print "Printing a line: " +line 

if __name__=='__main__': 
    status = main() 

tempfile.csv Supongamos que algún archivo con dos líneas,

$ cat tempfile.csv 
line1 
line2 

entonces puedo ejecutar mi script con: $ tempfile.csv gato | ./my_script.py, y todo está bien:

$ cat tempfile.csv | ./my_script.py 
Printing a line: line1 

Printing a line: line2 

Por otro lado, si pongo pdb.set_trace() en cualquier lugar y luego me sale un error. Por ejemplo, poner pdb.set_trace() por debajo principal def(), entonces consigo

$ cat tempfile.csv | ./my_script.py 
> /home/ilangmore/mobiuss/TM/branches/hadooprotype/my_script.py(7)main() 
-> for line in sys.stdin: 
(Pdb) *** NameError: name 'line1' is not defined 
(Pdb) *** NameError: name 'line2' is not defined 
(Pdb) 
Traceback (most recent call last): 
    File "./my_script.py", line 11, in <module> 
    status = main() 
    File "./my_script.py", line 7, in main 
    for line in sys.stdin: 
    File "./my_script.py", line 7, in main 
    for line in sys.stdin: 
    File "/usr/lib/python2.7/bdb.py", line 48, in trace_dispatch 
    return self.dispatch_line(frame) 
    File "/usr/lib/python2.7/bdb.py", line 67, in dispatch_line 
    if self.quitting: raise BdbQuit 
bdb.BdbQuit 

Tenga en cuenta que mi pregunta está probablemente relacionado con this question (es decir pdb por defecto lee de la entrada estándar), pero necesito más ayuda.

Respuesta

3

El asunto es: cat no parará de enviar datos porque su script está depurando actualmente. Y cuando va a rastrear, stdin todavía está lleno por cat + su teclado. Tienes que elegir uno de ellos.

Usted puede leer toda la entrada estándar, y luego, set_trace() no será llenado por la entrada estándar:

sys.stdin.read() 
pdb.set_trace() 
+2

Esto parece ayudar pero no completamente. Puse sys.stdin.read() en algunos lugares, y pdb.set_trace() a continuación, y ya no obtengo el NameError. Sin embargo, pdb no se abre ... simplemente sale (el mismo mensaje que el anterior, sin NameError) –

2

es posible que desee ver cómo el RDB Apio (depurador remoto) funciona módulo contrib:

https://github.com/celery/celery/blob/master/celery/contrib/rdb.py

parece involucrar una gran cantidad de procesamiento de flujos, pero yo lo he probado, y funciona por lo que le permite telnet en un nuevo puerto de red local. No es el ipdb mucho mejor, sino simplemente pdb.

1

Me encontré con este problema exacto hoy. Descubrí que Winpdb funciona perfectamente.

+0

¿Cómo se invoca winpdb en este caso? –

13

He aquí un ejemplo de lo que funcionó para mí:

lines = sys.stdin.readlines() 
sys.stdin = open('/dev/tty') 
pdb.set_trace() 
+0

Tuve el mismo problema y esto funcionó muy bien. Alguien sabe por qué? – unclejamil

+3

Pdb lee de stdin para ser interactivo; así que para usar pdb primero debe leer todos los stdin, luego establecer stdin para que sea la interfaz de teletipo o en otras palabras conectarlo nuevamente a su terminal y teclado en lugar del shell pipe. En ese punto puede iniciar pdb como lo normal (y úselo) – ThorSummoner

+1

Utilicé: 'import sys; sys.stdin = open ('/ dev/tty'); importar pdb; pdb.set_trace() ' –

2

Con el módulo de ripdb (pip install ripdb) resuelto este problema para mí.

Cuestiones relacionadas