在通过管道读取标准输入的脚本中使用 pdb.set_trace()

2024-06-19

我有一个通过管道读取标准输入的 python 脚本,但我似乎无法将它与 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

请注意,我的问题可能与这个问题 https://stackoverflow.com/questions/3101777/run-pdb-without-stdin-stdout-using-fifo(即 pdb 默认从 stdin 读取),但我需要更多帮助。


这是对我有用的示例:

import sys
import pdb

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

Edit: 从 3.7 开始你不再需要导入pdb for set_trace,它可以作为breakpoint https://docs.python.org/3/library/functions.html#breakpoint,所以上面只需要一个sys import.

import sys

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

您可能希望更换sys.stdin.readlines()上面是可迭代的fileinput.input() (which defaults https://docs.python.org/3/library/fileinput.html to sys.stdin如果文件列表在sys.argv[1:]是空的)像这样:

import fileinput
import sys

lines = fileinput.input()
sys.stdin = open("/dev/tty")
breakpoint()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在通过管道读取标准输入的脚本中使用 pdb.set_trace() 的相关文章

随机推荐