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

sys.stdin.readlines()挂起Python脚本,python,stdin,freeze,readlines,Python,Stdin,Freeze,Readlines,每次我执行Python脚本时,它都会挂起这一行: lines = sys.stdin.readlines() 我应该如何解决/避免此问题 编辑 下面是我对行所做的操作: lines = sys.stdin.readlines() updates = [line.split() for line in lines] 编辑2 我是从git钩子运行这个脚本的,所以EOF中是否存在任何问题?这在很大程度上取决于您试图完成的任务。您可能会: for line in sys.stdin: #do

每次我执行Python脚本时,它都会挂起这一行:

lines = sys.stdin.readlines()
我应该如何解决/避免此问题

编辑

下面是我对
行所做的操作:

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


我是从git钩子运行这个脚本的,所以EOF中是否存在任何问题?

这在很大程度上取决于您试图完成的任务。您可能会:

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

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

除非您将某个行为重定向到
stdin
。也就是说,从
stdin
(运行脚本的控制台)读取输入。它正在等待您的输入


请参阅:

如果您在交互式会话中运行该程序,则此行将使Python从标准输入(即键盘)读取,直到您发送EOF字符(Ctrl-D(Unix/Mac)或Ctrl-Z(Windows))


我知道这并没有直接回答您的问题,因为其他人已经解决了EOF问题,但我发现,从长寿命子流程或stdin读取实时输出时,通常最有效的方法是while/if行方法:

while True:
    line = sys.stdin.readline()
    if not line:
       break
    process(line)
在这种情况下,sys.stdin.readline()将在返回EOF之前返回文本行。一旦给出EOF,将返回空行,从而触发循环中断。只要不提供EOF,挂起仍然可能发生


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

请注意,readlines()在返回之前需要一个EOF。在通过正在执行的应用程序/shell将EOF提供给stdin之前,不会发生这种情况。我正在从git钩子运行此脚本,所以EOF周围是否有其他内容?@BoA--抱歉,我对git钩子一无所知,尽管看起来如果您的程序正在从管道读取,它应该可以正常工作。@mgilson基本上它只是在提交后自动运行python脚本。@BoA--这很有道理,但是为什么不能按Ctrl-D呢?您的脚本从哪里获得输入?@mgilson脚本是自动运行的,我不会手动运行它。我还需要按Ctrl+D吗?我怎么知道什么时候按下它?我想@mgilson的答案会更好;这是可行的,但这是一种更为“Pythonic”的方式。我完全同意@mgilson的答案更为Pythonic的说法。我只是没有发现它对“实时输出”非常友好,例如从长时间运行的应用程序捕获状态信息以向用户报告状态,因为它需要类似文件的对象在循环开始处理之前生成EOF。在我的示例中,对readline()的调用将在返回EOF之前为我提供几行文本。EOF只需要通过给我一个空行从while中断。话虽如此,我可能可以改进我的描述,因为这不太清楚。奇怪的是,它对您有效,因为我可以在至少高达Python 2.6.6的sys.stdin和subprocess对象上显示上述行为,并且我不是唯一一个发现这种情况的人:。不要误解我的意思,我很乐意接受我可能错了,因为我更喜欢更简单的语法。不过,我只是注意到,上面的问题添加了以下注释:对于file.readline()与对于文件中的行,请参见(简言之:它适用于Python3;在Python2.6+上使用io.open())
while True:
    line = sys.stdin.readline()
    if not line:
       break
    process(line)