2012-06-19 5 views
3

Когда я отлаживал код c, я всегда использую 'gdb a.out < test' для перенаправления стандартного потока ввода. Но когда дело доходит до pdb, я нашел, что он не работает. После поиска в pdb help doc я все еще не могу найти что-то относительно этой проблемы.Как перенаправить стандартный ввод при отладке python?

EDIT: Я размещаю свой код. Можете ли вы помочь мне изменить его для чтения из файла с минимальной модификацией. Благодарю.

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) 
+0

Почему ты необходимо перенаправить стандартный поток ввода? Возможно, мы могли бы помочь вам с основной проблемой. –

+0

Я работаю над проблемой ACM. Поэтому мне нужно импортировать тестовые данные в свою программу. –

+1

Код Python легче изменить, чем пытаться сделать pdb делать то, что вы хотите в этом случае; просто загрузите вход из файла, а не из sys.stdin. –

ответ

1

Измените свою программу, чтобы прочитать тестовые данные из файла, указанного в командной строке.

+0

Это, хотя это то, что я обычно делаю, раздражает при отладке скриптов, которые предназначены для чтения из stdin ... – Fred

+1

Полностью анти Unix soul – jgomo3

0

Ok. Я нашел решение. Так что мне просто нужно прокомментировать и раскомментировать эти две строки, которые начинаются с 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) 
0

Как уродливой временного хака вы можете переопределить raw_input() (Python 2) или input() (Python 3) для чтения из файла, как это (для Python 2 заменить input с raw_input)

def input(f=open("test")): return f.readline().rstrip() 

# `input()` now reads from "test" file instead of STDIN! 
... = input() 
Смежные вопросы