13

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

lines = sys.stdin.readlines()

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

编辑

这是我正在做的事情lines

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

编辑 2

我正在从 git hook 运行这个脚本,所以 EOF 周围有没有?

4

4 回答 4

17

这在很大程度上取决于您要完成的工作。你也许可以这样做:

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

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

于 2012-08-03T16:07:21.923 回答
6

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

请参阅:“如何完成sys.stdin.readlines()输入?

于 2012-08-03T16:07:53.540 回答
3

如果您在交互式会话中运行程序,那么这一行会导致 Python 从标准输入(即您的键盘)读取,直到您发送 EOF 字符(Ctrl- D(Unix/Mac) 或Ctrl- Z(Windows))。

>>> import sys
>>> a = sys.stdin.readlines()
Test
Test2
^Z
>>> a
['Test\n', 'Test2\n']
于 2012-08-03T16:08:26.673 回答
3

我知道这不是直接回答您的问题,因为其他人已经解决了 EOF 问题,但通常我发现从长期存在的子进程或标准输入读取实时输出时效果最好的是 while/if 行方法:

while True:
    line = sys.stdin.readline()
    if not line:
       break
    process(line)

在这种情况下, sys.stdin.readline() 将在返回EOF之前返回文本行。一旦给出 EOF,将返回空行,触发循环中断。只要未提供 EOF,此处仍可能发生挂起

值得注意的是,当子进程/标准输入仍在运行时,处理“实时输出”的能力需要写入应用程序刷新它的输出。

于 2012-08-03T16:40:07.007 回答