【发布时间】:2021-08-26 18:30:54
【问题描述】:
我在 Linux (Ubuntu) 上。我有一个 c 程序,它处理与 arduino 的串行通信,让我每秒多次将传感器读数打印到控制台上。传入的数据流非常规律。我还有一个小的 python 程序应该获取这些数据并使用它。为了测试 python 文件只是 print(input()) 在一个无限循环中。如果我然后通过以下方式将串行通信传输到我的 python 程序中:
.sercom | python3 main.py
我输出的数据流变得非常不稳定,线条分批出现,中间有小停顿。这就是管道的工作原理吗?有什么办法可以让流量再次变得顺畅吗?如果不是,我可以使用哪些替代方案来在我的程序之间获得流畅的数据流?
编辑: 以下是如何重现我的意思:创建两个 python 文件
pipe_out.py:
from time import sleep
for n in range(0, 100000):
print(n, 'testing lines out of 100000')
sleep(0.001)
pipe_in.py:
for i in range(0, 100000):
print(input())
然后比较控制台输出的
python3 pipe_out.py
对
python3 pipe_out.py | python3 pipe_in.py
第一个输出非常平滑,而第二个输出断断续续,大约 500 行的块
【问题讨论】:
-
基于行的缓冲?无论如何,这里有一个适当的问题,请提取并提供minimal reproducible example。
-
感谢@UlrichEckhardt 提供有关基于行的缓冲的提示。有了这个,我能够修复它。问题确实是普通的 linux 管道使用行缓冲。 Here我找到了一个线程,通过expect包处理没有行缓冲区的管道,这解决了我的问题。