【问题标题】:Python to read stdin from other source continouslyPython从其他来源连续读取标准输入
【发布时间】:2016-05-13 09:17:16
【问题描述】:

是否可以让 Python 从其他来源(例如文件)连续读取标准输入?基本上我试图让我的脚本使用标准输入来回显输入,并且我想使用文件或外部源与之交互(同时保持打开状态)。

一个例子可能是(input.py):

#!/usr/bin/python

import sys

line = sys.stdin.readline()

while line:
    print line,
    line = sys.stdin.readline()

直接执行此操作,我可以连续输入文本,并在脚本保持活动状态时回显。如果您想使用外部源,例如文件或来自 bash 的输入,则脚本在收到输入后立即退出:

$ echo "hello" | python input.py
hello
$

最终我想做的是:

$ tail -f file | python input.py

然后,如果文件更新有 input.py 回显任何添加到文件中的内容,同时保持打开状态。也许我是用错误的方式接近这个,或者我只是一无所知,但是有没有办法做到这一点?

【问题讨论】:

  • 你试过了吗?如果它不起作用,您可能会遇到缓冲问题 - have a look
  • 它读取文件,但如果我更新文件,更改不会反映在 pythons 标准输入/标准输出中。
  • tail -f file 将继续发出附加到文件的数据。附加到文件的更新工作......你是用其他方式做的吗?
  • @RoryZipher Tail 只有在文件被附加到而不是更改时才会跟随。所以不是你会怎么做,vim。试试echo "stuff" >> file 测试一下。
  • 是的,我正在附加文件。例如,如果文件包含“hello”,那么我运行命令,在下一行附加“world”文件并保存它,它不会显示在当前执行进程的标准输入/标准输出中。

标签: python bash stdin watch


【解决方案1】:

使用tail-F 选项使其在文件被重命名或删除时重新打开文件,并使用原始名称创建新文件。一些编辑器以这种方式编写文件,日志文件轮换脚本通常也以这种方式工作(他们将原始文件重命名为filename.1,并创建一个新的日志文件)。

$ tail -F file | python input.py

【讨论】:

  • 这在我的 linux mint 上不起作用,我有点惊讶 tail 甚至接受了 -F-f,这告诉它后面跟着名称和文件描述符。但是tail -f F file | python input.py“工作” - 你是说tail -F file | python input.py吗?
  • 我误读了文档,我认为-F 修改了-f 的行为,而不是作为替代品。
猜你喜欢
  • 2021-08-03
  • 2015-07-05
  • 2012-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-30
  • 2012-02-17
  • 2011-12-16
相关资源
最近更新 更多