twisted reactor.spawnProcess得到stdout w / o在窗口上缓冲

时间:2013-10-03 09:12:44

标签: python twisted

我正在运行一个外部进程,我需要立即获取stdout所以我可以将其推送到textview,在GNU / Linux上我可以使用“usePTY = True”来逐行获取stdout,遗憾的是usePTY不是在Windows上可用。

我对扭曲很新,有没有办法在Windows上使用一些扭曲的(或python)魔法来获得相同的结果?

1 个答案:

答案 0 :(得分:10)

  

在GNU / Linux上我可以使用“usePTY = True”按行获取stdout

排序! usePTY=True实际上做的是创建一个PTY(一个“伪终端” - 你在GNU / Linux上登录shell时总会得到的东西,除非你有一个真正的终端没有人再做了:)而不是一个无聊的旧管道。 PTY很像管道,但它有一些额外的功能 - 但对你来说更重要的是,PTY与交互式会话(即用户)密切相关,而管道则与程序化用途(想想foo | bar - 没有用户看到foo的输出。)

这意味着人们倾向于使用PTY作为stdout的存在作为他们应该及时产生输出的信号 - 因为人类正在等待看到它。另一方面,作为stdout的常规旧管道的存在被视为另一个程序正在消耗输出的信号,它们应该以最有效的高效方式产生输出。

这个倾向在实践中意味着如果一个程序有一个PTY然后将行缓冲其输出,如果它有一个管道,那么将“阻止”缓冲其输出(通常在写入任何数据之前收集大约4kB的数据) - 因为线路缓冲的效率较低。

这里要注意的是,正在运行的程序执行此缓冲。无论你传递usePTY=True还是usePTY=False都没有对缓冲产生直接的影响:它只是对你正在运行的程序提示它应该做什么样的输出缓冲。

这意味着即使您通过usePTY=True也可以运行阻止缓冲区的程序,反之亦然。

但是...... Windows没有PTY。因此,Windows上的程序不能将PTY视为如何缓冲其输出的提示。

我实际上并不知道是否还有其他暗示,在Windows上尊重程序是常规的。我至少没见过一个。

如果你很幸运,那么你正在运行的程序将有一些方式来请求行缓冲输出。如果你正在运行Python,那么它就是 - PYTHONUNBUFFERED环境变量控制它,-u命令行选项也是如此(我认为它们都适用于Windows)。

顺便说一句,如果您计划在两个进程之间传递二进制数据,那么您可能还希望在子进程中将stdio置于二进制模式:

    import os, sys, mscvrt                                                                                                                  
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)                                                                                         
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)                                                                                        
    msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)