如何在Python调试时重定向标准输入?

5
当我调试 C 代码时,我通常使用“gdb a.out < test”来重定向标准输入流。但是当涉及到 pdb 时,我发现它不起作用。在 pdb 帮助文档中搜索后,我仍然找不到与此问题相关的内容。
编辑:我发布了我的代码。你能帮我最小化修改并从文件中读取吗?谢谢。
cnt = int(raw_input())
paths = []
for cs in range(cnt):
    action, path = map(None, (raw_input() + " dumb").split(" ", 1))
    if (action == "pwd"):
        print "/",
        for p in paths:
            print p + "/",
        print
    else:
        strs = path.split("/")
        for i in range(len(strs)):
            p = strs[i]
            if (p == ""): 
                continue
            if (p == ".."):
                paths.pop()
            else:
                paths.append(p)

为什么需要重定向标准输入流?也许我们可以帮助您解决潜在的问题。 - Martijn Pieters
我正在解决一些ACM问题,因此需要将测试数据导入到我的程序中。 - Frank Cheng
1
Python代码比尝试让pdb按照你的意愿工作更容易修改;只需从文件中加载输入,而不是从sys.stdin中加载。 - Martijn Pieters
3个回答

1

好的,我找到了解决方案。所以我只需要注释和取消注释这两行代码中的file,就可以切换stdin的来源方式。

import pdb
import sys

file = sys.stdin
#file = open('test', "r")

cnt = int(file.readline())
paths = []
for cs in range(cnt):
    inputs = file.readline().split()
    action  = inputs[0]
    if (action == "pwd"):
        sb = "/"
        for p in paths:
            sb = sb + p + "/"
        print sb
    else:
        path = inputs[1]
        strs = path.split("/")
        for i in range(len(strs)):
            p = strs[i]
            if (p == ""): 
                continue
            if (i == 1 and strs[0] == ""):
                paths = []
                paths.append(p)
                continue
            if (p == ".."):
                paths.pop()
            else:
                paths.append(p)

1
将您的程序更改为从命令行指定的文件中读取测试数据。

尽管这通常是我最终要做的事情,但在调试脚本以从stdin读取内容时,这会很烦人... - Fred
1
完全反Unix精神 - jgomo3

1
作为一个丑陋的临时解决方案,你可以重新定义raw_input()(Python 2)或input()(Python 3)以像这样从文件中读取(对于Python 2,请用raw_input替换input)。
def input(f=open("test")): return f.readline().rstrip()

# `input()` now reads from "test" file instead of STDIN!
... = input()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接