【问题标题】:sys.stdin.readlines() hangs Python scriptsys.stdin.readlines() 挂起 Python 脚本
【发布时间】: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 提供给标准输入之前,这不会发生。

标签: python stdin freeze readlines


【解决方案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 上显示上述行为,而且我不是唯一找到的人情况就是这样:stackoverflow.com/questions/2804543/…。不要误会我的意思,我非常欢迎接受我可能是错的,因为我更喜欢更简单的语法。
      • 我刚刚注意到,在上面的问题中添加了以下评论:对于 file.readline() 与对于文件中的行,请参阅bugs.python.org/issue3907(简而言之:它适用于 Python3;在 Python 2.6+ 上使用 io.open())
      猜你喜欢
      • 2011-04-05
      • 2020-06-14
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 2016-04-08
      相关资源
      最近更新 更多