【发布时间】:2015-10-23 14:41:29
【问题描述】:
我正在编写一个 python 脚本,它可以通过管道从另一个命令读取输入
batch_job | myparser
我的脚本myparser 处理batch_job 的输出并写入它自己的标准输出。我的问题是我想立即查看输出(batch_job 的输出是逐行处理的),但似乎有这个臭名昭著的标准输入缓冲(据称是 4KB,我尚未验证)延迟了一切。
我尝试了以下方法:
- 使用
os.fdopen(sys.stdin.fileno(), 'r', 0)打开标准输入 - 在我的 hashbang 中使用
-u:#!/usr/bin/python -u - 在调用脚本之前设置
export PYTHONUNBUFFERED=1 - 在读取的每一行之后刷新我的输出(以防问题来自输出缓冲而不是输入缓冲)
我的 python 版本是 2.4.3 - 我不可能升级或安装任何额外的程序或包。我怎样才能摆脱这些延迟?
【问题讨论】:
-
您确定缓冲发生在 Python 中的标准输入上,而不是批处理作业的标准输出上吗?有时应用程序会检查标准输出的设备类型,并将其缓冲基于它是什么,所以仅仅因为它在写入终端时可能看起来是行缓冲并不意味着它在通过管道传输到另一个进程时也会这样做。跨度>
-
这是一个有趣的建议。我将尝试验证。我能说的是应用程序本身就是shell脚本。
-
它还会创建一个日志文件,其内容与通常写入终端的内容相同。我观察到这个日志文件更新得更快,即它已经包含我的脚本仍在等待的行。
-
为什么不直接从
myparser中启动batch_job作为子进程,然后您就可以完全控制STDOUT/STDIN?您设置它的方式不仅取决于 Python,还取决于 shell 缓冲本身。
标签: python stdin unbuffered