我一直在尝试各种方法(popen,pipes + fork / exec,…)来读取一个subprocess的输出,所有这些都在工作,但performance出相同的行为:每当我尝试read
/ fread
,只有在缓冲区满了或者退出的时候才会返回。 我正在寻找更像套接字的行为:只要有一些数据可用,就可以读取任何数量的数据。
我怎么做?
一般你不这样做。 特别是,子进程将缓冲流,因为它不会将连接到管道的流视为“交互式”。 由于缓冲发生在子进程内部,所以防止它的唯一方法是重写子进程中的代码,以防止它缓冲其标准输出(无论是否曾经或者当传递特定开关时,或者可以添加代码检测它何时连接到一个管道,并只在这个特定的情况下关闭缓冲)。 但是,如果写入很多标准输出(尤其是如果您不关心什么时候禁用缓冲),则会影响孩子的表现。
我不认为这是可能的。 缓冲是在孩子身边处理的,如果没有冲洗缓冲区,那么你就没有什么可读的。 但是,有一些工具有控制缓冲的命令行选项,例如grep --line-buffered
。