gpt4 book ai didi

linux - 使用无缓冲管道作为 "dummy"文件输出

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:36 30 4
gpt4 key购买 nike

我一直在处理一个我找不到解决方法的奇怪问题。

我的情况如下。

我在 python 中有一个名为“app1”的应用程序,它需要一个文件来输出它的执行结果。

我有一个辅助应用程序,称为“app2”;一个二进制文件,从标准输入中获取输入

我想将“app1”生成的内容直接传递给“app2”进行处理,理想情况下应该是这样的:

app1 | app2

但是,正如我所说,存在一些限制,例如 app1 需要一个文件 作为输出。我找到的第一个“愚弄”app1 输出到 stdout 的解决方案是使用 mkfifo 并创建一个管道,这样我就可以将它通过管道传输到 app2 中的 stdin。像这样:

pipe='/tmp/output_pipe'
mkfifo "$output_pipe"

python app1 -o "$output_pipe" &
app2 < $tmp_pipe

问题是,最终,在执行过程中,app1 将生成比 app2 可以处理的输入更多的输出,并且由于管道上的缓冲区大小限制,管道将被填满一切都将停止工作。

然后我使用了另一种方法:

python app1 -o /dev/stdout | app2

但情况与 stdout 也有缓冲区大小限制相同。

有人知道我该如何解决这个特定场景吗?

TL;DR:我需要一个“虚拟”文件作为标准输出,但没有管道的标准大小限制。

最佳答案

有几个实用程序旨在处理类似情况:

  1. 缓冲区:python app1 -o/dev/stdout |缓冲区 | app2

  2. stdbuf:python app1 -o/dev/stdout | stdbuf app2

  3. unbuffer:python app1 -o/dev/stdout |取消缓冲 app2

  4. mbuffer(buffer 有更多选项):python app1 -o/dev/stdout |缓冲 | app2

  5. bash process substitution : python app1 -o >(app2)

实用程序有各种选项,其中一些可能在这里是必需的(这取决于 app1app2 正在做什么)。一些选项设置缓冲区的大小,或添加延迟,或显示诊断信息。

Pixelbeat.org has some diagrams帮助可视化缓冲的工作方式(或失败)。

关于linux - 使用无缓冲管道作为 "dummy"文件输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48254312/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com