在通过管道读取stdin的脚本中使用pdb.set_trace()

时间:2012-02-07 15:16:01

标签: python

我有一个python脚本通过管道读取stdin,我似乎无法将它与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()

假设tempfile.csv是一个包含两行的文件,

$ cat tempfile.csv 
line1
line2

然后我可以运行我的脚本: $ cat tempfile.csv | ./my_script.py,一切都很好:

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

Printing a line:  line2

另一方面,如果我将pdb.set_trace()置于任何地方,那么我会收到错误。例如,将pdb.set_trace()放在def main()下面,然后我得到

$ 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

请注意,我的问题可能与this question有关(即pdb默认从stdin读取),但我需要更多帮助。

6 个答案:

答案 0 :(得分:17)

这是一个对我有用的例子:

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

答案 1 :(得分:5)

问题是:cat不会停止发送数据,因为您的脚本当前正在调试。当你要追踪时,stdin仍由cat +你的键盘填充。你需要选择其中一个。

你可以读取整个stdin,然后,set_trace()将不会被stdin填充:

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

答案 2 :(得分:4)

使用ripdb模块(pip install ripdb)为我解决了这个问题。

答案 3 :(得分:2)

您可能想了解Celery RDB(远程调试器)contrib模块的工作原理:

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

它似乎涉及大量的流处理,但我已对其进行了测试,它的工作原理是允许您远程登录到新的本地网络端口。这不是更好的ipdb,而只是pdb。

答案 4 :(得分:1)

我今天遇到了这个问题。我发现Winpdb完美无缺。

答案 5 :(得分:1)

为了完整起见,我根据接受的答案制作了以下代码的片段。

import sys; sys.stdin = open('/dev/tty'); import pdb; pdb.set_trace();
相关问题