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.
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.
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().
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()
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With