Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Twisted,ProcessProtocol如何接收不带缓冲的标准输出?_Python_Twisted_Multiprocessing_Buffering - Fatal编程技术网

Python Twisted,ProcessProtocol如何接收不带缓冲的标准输出?

Python Twisted,ProcessProtocol如何接收不带缓冲的标准输出?,python,twisted,multiprocessing,buffering,Python,Twisted,Multiprocessing,Buffering,我使用的是外部进程,它为处理的每个数据块写入短行输出。我希望在每一行之后都能及时做出反应。但是,ProcessProtocol的.outReceived()似乎已缓冲。文件说明: .outReceived(数据):使用从接收到的数据调用 流程的标准管道管道倾向于以更大的格式提供数据 块比套接字大(1 KB是一种常见的缓冲区大小),因此 可能不会经历典型的“随机点滴”行为 网络套接字,但无论如何,如果您 不要在一次通话中获取所有数据。要做得好,, outReceived应该简单地积累数据并推迟进行

我使用的是外部进程,它为处理的每个数据块写入短行输出。我希望在每一行之后都能及时做出反应。但是,
ProcessProtocol
.outReceived()
似乎已缓冲。文件说明:

.outReceived(数据):使用从接收到的数据调用 流程的标准管道管道倾向于以更大的格式提供数据 块比套接字大(1 KB是一种常见的缓冲区大小),因此 可能不会经历典型的“随机点滴”行为 网络套接字,但无论如何,如果您 不要在一次通话中获取所有数据。要做得好,, outReceived应该简单地积累数据并推迟进行 在整个过程结束之前,不要用它做任何事情

结果是,在整个处理完成后,我在一个块中获得输出。如何强制
ProcessProtocol
不缓冲标准输出

我使用的是外部进程,它为处理的每个数据块写入短行输出。我希望在每一行之后都能及时做出反应

结果是,在整个处理完成后,我在一个块中获得输出。如何强制ProcessProtocol不缓冲标准输出

缓冲发生在生产者过程中,而不是消费者。标准C库
stdout
仅在连接到终端时才进行线路缓冲,否则将完全缓冲。这就是当生产者进程未连接到终端时,它以大块而不是逐行输出数据的原因

使用实用程序强制生产者进程“
stdout
进行行缓冲


如果生产者进程是python脚本,请使用
-u
python解释器开关完全关闭标准流的缓冲<代码>stdbuf实用程序更好。

不是直接的答案,但肯定包含指向它的清晰指针。正如您所说,stdout在连接到终端时是行缓冲的,因此使用
spawnProcess
usePTY=True
解决了这个问题。我不熟悉twisted,无法判断
usePTY
是否有用。标准C库使用
isatty()
函数检测它是否连接到终端。因此,另一个选项是
LD_PRELOAD
一个库,该库超级强制
isatty()
始终返回
1
。我刚刚检查并得到
usePTY
帮助,我得到了我想要的逐行输出。Sux.UpTy将STDUT和STDRR结合起来,我需要它们分开(一个是协议流,另一个是..错误)。在选择这个解决方案时,请注意这一点,并考虑其中的一个。如果Python—u不是一个选项,考虑OS.FDOPEN(sys .StdOut.Fielo()),'W’,0)。