Python 2.7 Python子进程在记录流数据时滞后

Python 2.7 Python子进程在记录流数据时滞后,python-2.7,subprocess,windows-8.1,live-streaming,Python 2.7,Subprocess,Windows 8.1,Live Streaming,我正在尝试使用python中的子流程读取实时传感器流。特别是,子流程运行输出数据的命令行程序。这些数据被输入标准输出,然后逐行读取。代码如下: proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0) while True: line_out = proc.stdout.readline() sys.stdout.flush() 此代码生成传感器数据输出,但在运行时会产生时间延迟。因此,最初传感器和子流

我正在尝试使用python中的子流程读取实时传感器流。特别是,子流程运行输出数据的命令行程序。这些数据被输入标准输出,然后逐行读取。代码如下:

proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, bufsize=0)

while True:
    line_out =  proc.stdout.readline()
    sys.stdout.flush() 
此代码生成传感器数据输出,但在运行时会产生时间延迟。因此,最初传感器和子流程是同步的,但在一小时内,子流程落后了45分钟

如您所见,我尝试了“bufsize=0”。我还尝试使用-u选项运行python。由于我运行的是Windows 8和python 2.7,因此无法使用Pexpect

如何从子流程中获得不产生时间延迟的流式输出?

请参阅SO查询,该查询应该解决您的问题。基于创建子流程的方式;您正在使用未缓冲的输入。这不仅在Python中,而且在另一个运行时中,性能都很差

bufsize
设置为-1-这将确保使用完全缓冲(系统默认模式)读取输入


进行此更改后,请检查性能并通知我们。

无缓冲是昂贵的-每个字符都是独立读/写的。对于您的使用,请考虑BuFFASSIZE=1 [行缓冲]。这意味着您将获得与示例使用相匹配的缓冲,这将更加高效……您确定吗?为什么在这里使用
sys.stdout.flush()
?(这是毫无意义的。在您的示例中没有打印到stdout的代码)。您在哪里传递
-u
选项?为什么您认为它会对
cmd
产生任何影响?
cmd
是Python脚本吗?如果是时间性能问题。启动python时传递-u选项:python-u script.py由于-u参数指定stdout和stdin是无缓冲的,因此它绝对会对调用的子进程产生影响。子流程是一个可执行文件,但在这里的讨论中这并没有什么不同。谢谢您的详细回答。最后,我使用-1启用完全缓冲,并在调用脚本时删除了-u参数。看起来我的摄入量不再滞后了。我将继续测试这个,并让你知道,如果它引起了一段时间的延迟。