sys.stdin.readlines()挂起Python脚本

时间:2012-08-03 16:03:36

标签: python stdin hang readlines

每次我执行我的Python脚本时,它似乎都挂在这一行:

lines = sys.stdin.readlines()

我该怎么做才能解决/避免这种情况?

修改

以下是我对lines所做的事情:

lines = sys.stdin.readlines()
updates = [line.split() for line in lines]

编辑2

我是从git hook运行这个脚本的,所以在EOF周围有吗?

4 个答案:

答案 0 :(得分:14)

这很大程度上取决于您要完成的任务。你可以这样做:

for line in sys.stdin:
    #do something with line

当然,使用这个成语以及您正在使用的readlines()方法,您需要以某种方式将EOF字符发送到您的脚本,以便它知道文件已准备好读取。 (在unix上,Ctrl-D通常可以解决问题)。

答案 1 :(得分:5)

除非您将某些内容重定向到stdin,否则这将是预期的行为。这就是从stdin读取输入(这将是您运行脚本的控制台)。它正在等待你的输入。

请参阅:"How to finish sys.stdin.readlines() input?

答案 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仍在运行时,处理“实时输出”的能力需要编写应用程序来刷新它的输出。