每次我执行我的Python脚本时,它似乎都挂在这一行:
lines = sys.stdin.readlines()
我该怎么做才能解决/避免这种情况?
修改
以下是我对lines
所做的事情:
lines = sys.stdin.readlines()
updates = [line.split() for line in lines]
编辑2
我是从git hook运行这个脚本的,所以在EOF周围有吗?
答案 0 :(得分:14)
这很大程度上取决于您要完成的任务。你可以这样做:
for line in sys.stdin:
#do something with line
当然,使用这个成语以及您正在使用的readlines()
方法,您需要以某种方式将EOF字符发送到您的脚本,以便它知道文件已准备好读取。 (在unix上,Ctrl-D通常可以解决问题)。
答案 1 :(得分:5)
除非您将某些内容重定向到stdin
,否则这将是预期的行为。这就是从stdin
读取输入(这将是您运行脚本的控制台)。它正在等待你的输入。
答案 2 :(得分:3)
如果您在交互式会话中运行程序,则此行会导致Python从标准输入(即键盘)读取,直到您发送EOF字符( Ctrl - D (Unix / Mac)或 Ctrl - Z (Windows))。
>>> import sys
>>> a = sys.stdin.readlines()
Test
Test2
^Z
>>> a
['Test\n', 'Test2\n']
答案 3 :(得分:3)
我知道这不是直接回答你的问题,因为其他人已经解决了EOF问题,但通常我发现在从长寿子流程中读取实时输出时效果最好或者stdin是while / if行方法:
while True:
line = sys.stdin.readline()
if not line:
break
process(line)
在这种情况下,sys.stdin.readline()将在返回EOF之前返回文本行。一旦给出EOF,将返回空行,触发循环中断。只要没有提供EOF, hang 仍然可以在这里出现。
值得注意的是,当subprocess / stdin仍在运行时,处理“实时输出”的能力需要编写应用程序来刷新它的输出。