【问题标题】:How to read most recent line from stdin in python如何从python中的stdin读取最新行
【发布时间】:2014-11-27 16:05:37
【问题描述】:

有没有办法只从标准输入读取当前数据?

我想将一些永无止境的输入数据(来自类似鼠标的设备)通过管道传输到 python 脚本中,并且只获取最新的数据行。

输入的 x,y 数据如下所示,以每秒 600 行的速度到达:

0.123,0.123
0.244,0.566
etc.

到目前为止,我已经尝试过这样的事情:

import sys, time

while 1:
    data = sys.stdin.readline()
    my_slow_function(data)

Python 似乎会缓冲数据,因此不会跳过任何内容。我想跳过当前行以外的所有内容。

【问题讨论】:

  • 你怎么知道什么时候是线路?
  • 我只查找最新的线路数据。

标签: python stdin


【解决方案1】:

只需启动一个单独的线程即可将标准输入读入全局变量。让它成为一个守护线程,这样你以后就不必关闭它了。线程在数据到达时读取数据并不断丢弃旧数据。让您的常规程序在需要时读取 last_line。

我添加了一个事件,以便常规程序可以在没有新数据可用时等待。如果这不是你想要的,那就把它拿出来。

import sys
import threading

last_line = ''
new_line_event = threading.Event()


def keep_last_line():
    global last_line, new_line_event
    for line in sys.stdin:
        last_line = line
        new_line_event.set()

keep_last_line_thread = threading.Thread(target=keep_last_line)
keep_last_line_thread.daemon = True
keep_last_line_thread.start()

【讨论】:

【解决方案2】:

保留当前行,只作用于最后一行。

buffer = None
for line in sys.stdin:
    buffer = line
my_slow_function(buffer)

【讨论】:

  • 我不会把这称为 hack :)
  • 谢谢,但它不起作用,因为标准输入是恒定的。它来自一个设备。所以 for 循环永远不会结束。
  • @chriskelly 所以没有最后一行。
  • @chriskelly,那是键盘之类的输入设备吗?如果是这样,请点击 [Ctrl+D](或 Windows 上的 [Ctrl+Z], [Enter])让它将 EOF 发送到您的程序。
  • @chriskelly 你的“最后一行”是什么?
猜你喜欢
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2018-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多