我正在运行一个外部进程,我需要立即获取stdout所以我可以将其推送到textview,在GNU / Linux上我可以使用“usePTY = True”来逐行获取stdout,遗憾的是usePTY不是在Windows上可用。
我对扭曲很新,有没有办法在Windows上使用一些扭曲的(或python)魔法来获得相同的结果?
答案 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)