我一直在处理一个我找不到解决办法的奇怪问题。
我的情况如下。
我在python中有一个名为“app1”的应用程序,它需要一个文件来输出它的执行结果。
我有一个称为“app2”的二级应用程序;一个从stdin获取输入的二进制程序。
我想将“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:我需要一个“虚拟”文件,它将充当stdout,但不受管道的标准大小限制。
最佳答案
有几个实用程序设计用于处理类似情况:buffer
:python app1 -o /dev/stdout | buffer | app2
stdbuf
:python app1 -o /dev/stdout | stdbuf app2
unbuffer
:python app1 -o /dev/stdout | unbuffer app2
mbuffer
(buffer
有更多选项):python app1 -o /dev/stdout | mbuffer | app2
bash
process substitution:python app1 -o >(app2)
实用程序有各种选项,其中一些选项可能在这里是必需的(这取决于app1和app2在做什么)。一些选项设置缓冲区的大小,或添加延迟,或显示诊断信息。
Pixelbeat.org has some diagrams帮助可视化缓冲的工作方式(或失败)。
关于linux - 使用无缓冲管道作为“虚拟”文件输出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48254312/