sys.stdin.readlines() 挂起 Python 脚本
Posted
技术标签:
【中文标题】sys.stdin.readlines() 挂起 Python 脚本【英文标题】:sys.stdin.readlines() hangs Python script 【发布时间】:2012-08-01 17:07:18 【问题描述】:每次我执行我的 Python 脚本时,它似乎都挂在这一行:
lines = sys.stdin.readlines()
我应该怎么做才能解决/避免这种情况?
编辑
这就是我对lines
所做的事情:
lines = sys.stdin.readlines()
updates = [line.split() for line in lines]
编辑 2
我正在从一个 git 钩子运行这个脚本,所以 EOF 周围还有吗?
【问题讨论】:
请注意 readlines() 需要 EOF 才能返回。在通过正在执行的应用程序/shell 将 EOF 提供给标准输入之前,这不会发生。 【参考方案1】:这在很大程度上取决于您要完成的工作。你也许可以这样做:
for line in sys.stdin:
#do something with line
当然,对于这个习惯用法以及您正在使用的readlines()
方法,您需要以某种方式将EOF 字符发送到您的脚本,以便它知道文件已准备好读取。 (在 unix 上,Ctrl-D 通常可以解决问题)。
【讨论】:
我正在从一个 git 挂钩运行这个脚本,所以 EOF 周围还有吗? @BoA -- 抱歉,我对 git 钩子一无所知,尽管看起来如果您的程序正在从管道读取,它应该可以工作。 @mgilson 基本上它只是在提交后自动运行 python 脚本。 @BoA -- 这是有道理的,但你为什么不能按 Ctrl-D?您的脚本从哪里获得输入? @mgilson 脚本是自动运行的,我不手动运行。我还需要按Ctrl+D吗?我怎么知道什么时候按下它?【参考方案2】:除非您将某些内容重定向到 stdin
,否则这是预期的行为。这就是说从stdin
读取输入(这将是您运行脚本的控制台)。它正在等待您的输入。
见:"How to finish sys.stdin.readlines()
input?
【讨论】:
【参考方案3】:如果您在交互式会话中运行程序,则此行会导致 Python 从标准输入(即您的键盘)读取,直到您发送 EOF 字符 (Ctrl-D (Unix/Mac) 或 Ctrl-Z (Windows))。
>>> import sys
>>> a = sys.stdin.readlines()
Test
Test2
^Z
>>> a
['Test\n', 'Test2\n']
【讨论】:
【参考方案4】:我知道这不是直接回答您的问题,因为其他人已经解决了 EOF 问题,但通常我发现在读取 long living 子进程的实时输出时效果最好,或者stdin 是 while/if 行方法:
while True:
line = sys.stdin.readline()
if not line:
break
process(line)
在这种情况下,sys.stdin.readline() 将在返回 EOF 之前返回文本行。一旦给出 EOF,将返回空行,触发循环中断。只要不提供 EOF,hang 仍然可能在此处发生。
值得注意的是,当子进程/标准输入仍在运行时,处理“实时输出”的能力需要写入应用程序刷新它的输出。
【讨论】:
我认为@mgilson 的回答会更好;这会起作用,但它是更“Pythonic”的方式 我完全同意@mgilson 的回答更符合pythonic 的说法。我只是没有发现它对“实时输出”非常友好,例如从长时间运行的应用程序中捕获状态信息以将状态报告给用户,因为它需要像对象这样的文件在循环开始之前产生一个 EOF加工。在我的示例中,对 readline() 的调用将在返回 EOF 之前为我提供文本行。只需要通过给我一个空行来中断 EOF。话虽如此,我可能可以改进我的描述,因为这不是很清楚。 很好奇它对你有用,因为对于 sys.stdin 和 subprocess 对象,我至少可以在 Python 2.6.6 上显示上述行为,而且我不是唯一找到的人情况就是这样:***.com/questions/2804543/…。不要误会我的意思,我非常欢迎接受我可能是错的,因为我更喜欢更简单的语法。 我刚刚注意到,在上面的问题中添加了以下评论:对于 file.readline() 与对于文件中的行,请参阅bugs.python.org/issue3907(简而言之:它适用于 Python3;在 Python 2.6+ 上使用 io.open())以上是关于sys.stdin.readlines() 挂起 Python 脚本的主要内容,如果未能解决你的问题,请参考以下文章
在Python 3中将Ctrl-D与sys.stdin.readlines()结合使用后,如何避免input()出现EOFError?
Kotlin 协程协程的挂起和恢复 ② ( 协程挂起 和 线程阻塞 对比 )