阅读sys.stdin后的Python交互

阅读sys.stdin后的Python交互,python,parsing,stdin,python-interactive,Python,Parsing,Stdin,Python Interactive,我正在尝试编写一个小型图形解析器,它从stdin读取数据,并将处理后的输出写入stdout,如下所示: # parser.py G = defaultdict(list) for line in sys.stdin: node, neighbor = line.split() G[node].append(neighbor) print(G) 我想使用python-I parser.py

我正在尝试编写一个小型图形解析器,它从
stdin
读取数据,并将处理后的输出写入
stdout
,如下所示:

# parser.py
G = defaultdict(list)
for line in sys.stdin:
    node, neighbor = line.split()
    G[node].append(neighbor)
print(G)
我想使用
python-I parser.py
调用脚本,并与我创建的对象交互,但即使使用
-I
选项调用python,解释器也总是在代码运行后退出。注意:
ipython
也会发生同样的情况;这甚至证实了我“真的想退出”

一种解决方法是编写代码以使用作为参数传入的特定文件,但我想知道是否有方法可以使Python在上面的示例中不退出解释器。

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:
    ...

用于fileinput.input()中的行:
@J.F.Sebastian:这是不可扩展的。如果OP希望在将来添加更多参数,他们将需要修改基于
fileinput
的解决方案。这种返工有破坏向后兼容性的风险(例如,因为有人想传递一个名为
-h
)的文件。@J.F.:那么您最好将
sys.argv[1]
传递到
open()
或返回到
sys.stdin
。我的意思是,您不需要
fileinput
的多文件功能,对吧?我明白了。这确实感觉是正确的方法;这让我可以通过
python-i parser.py
测试手动构造的小示例,并通过
python-i parser.py file.txt
@Kevin:
fileinput.input()
测试真实数据。input()是最简单的方法,它可以接受文件输入并自动返回到
sys.stdin