2

我正在运行一个外部进程,我需要立即获取标准输出,以便我可以将其推送到文本视图,在 GNU/Linux 上,我可以使用“usePTY=True”逐行获取标准输出,不幸的是,usePTY 在 Windows 上不可用.

我对扭曲还很陌生,有没有办法在 Windows 上使用一些扭曲(或可能是 python)的魔法东西来实现相同的结果?

4

1 回答 1

10

在 GNU/Linux 上,我可以使用“usePTY=True”逐行获取标准输出

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

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

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

这里要注意的是,您正在运行的程序会执行此缓冲。无论您是否通过usePTY=TrueusePTY=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)           
于 2013-10-03T12:03:34.100 回答