2015-02-11 1 views
1

Я пытаюсь написать небольшой граф парсер, который считывает из stdin и записывает обработанный вывод stdout вдоль линий:Python интерактивный после прочтения sys.stdin

# parser.py 
G = defaultdict(list) 
for line in sys.stdin: 
    node, neighbor = line.split() 
    G[node].append(neighbor) 
print(G) 

Я хотел бы, чтобы вызвать сценарий с python -i parser.py < data.txt и взаимодействовать с объектами, которые я создал, но интерпретатор всегда выходит после запуска кода, даже когда я вызываю Python с опцией -i. Нотабене То же самое происходит с ipython; это даже подтверждает для меня, что я «действительно хочу выйти».

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

ответ

3

REPL (интерактивная консоль) выходит, когда он исчерпывает стандартный ввод. Обычно стандартный ввод - это консоль, поэтому он выводится только при вводе^D или вызове quit() вручную. Но если вы перенаправите stdin из файла, stdin будет исчерпан, когда вы достигнете конца файла.

Вы можете использовать argparse принять файл в командной строке, по умолчанию sys.stdin:

parser = argparse.ArgumentParser() 
parser.add_argument('input', type=argparse.FileType(), nargs='?', default=sys.stdin) 
args = parser.parse_args() 
G = defaultdict(list) 
for line in args.input: 
    ... 
+0

'для линии в fileinput.input():' – jfs

+0

@ J.F.Sebastian: Это не расширяемой. Если OP захочет добавить больше аргументов в будущем, им придется переработать решения на основе 'fileinput'. Такая переработка приводит к нарушению обратной совместимости (например, потому что кто-то хотел передать файл с именем -h'). – Kevin

+0

[YAGNI] (http://en.wikipedia.org/wiki/You_aren't_gonna_need_it) – jfs