Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use pdb.set_trace() in a script that reads stdin via a pipe

Tags:

python

I have a python script that reads stdin via a pipe, and I cannot seem to use it with pdb.set_trace().

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

Suppose tempfile.csv is some file with two lines,

$ cat tempfile.csv  line1 line2 

then I can run my script with: $ cat tempfile.csv | ./my_script.py, and everything is fine:

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

On the other hand, if I put pdb.set_trace() anywhere then I get an error. For example, putting pdb.set_trace() below def main(), then I get

$ 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 

Note that my question is probably related to this question (i.e. pdb by default reads from stdin), but I need more help.

like image 930
Ian Langmore Avatar asked Feb 07 '12 15:02

Ian Langmore


People also ask

What is PDB Set_trace ()?

pdb. set_trace (*, header=None) Enter the debugger at the calling stack frame. This is useful to hard-code a breakpoint at a given point in a program, even if the code is not otherwise being debugged (e.g. when an assertion fails). If given, header is printed to the console just before debugging begins.

How to use pdb debugger in Python?

Starting Python Debugger To start debugging within the program just insert import pdb, pdb. set_trace() commands. Run your script normally and execution will stop where we have introduced a breakpoint. So basically we are hard coding a breakpoint on a line below where we call set_trace().


1 Answers

Here's an example of what worked for me:

import sys import pdb  lines = sys.stdin.readlines() sys.stdin = open("/dev/tty") pdb.set_trace() 

Edit: since 3.7 you no longer need to import pdb for set_trace, it is available as breakpoint, so the above only requires a sys import.

import sys  lines = sys.stdin.readlines() sys.stdin = open("/dev/tty") breakpoint() 

You may wish to replace sys.stdin.readlines() above with the iterable fileinput.input() (which defaults to sys.stdin if the list of files in sys.argv[1:] is empty) like so:

import fileinput import sys  lines = fileinput.input() sys.stdin = open("/dev/tty") breakpoint() 
like image 169
Carl Smith Avatar answered Sep 20 '22 02:09

Carl Smith