从 subprocess.Popen 读取 STDERR 和 STDOUT 管道

问题描述 投票:0回答:1

我正在编写一个扩展 Popen 的类,并且(在开发的现阶段)我希望它将 Popen.stderr 和 Popen.stdout 的内容实时写入日志文件。稍后我会想检查内容,但现在我只能阅读它们。

(如果重要的话,我正在运行 Windows 10。但我正在寻找跨平台的解决方案。)

我正在使用以下在线程中运行的代码来阅读这两篇文章。

while self.isRunning():
    output = self.stdout.readline().rstrip()
    if  len( output ) > 0 :
        self.processOutput( output )
          
    if self.errHandling == PIPE:  
        error = self.stderr.readline().rstrip()
        if  len( error ) > 0 :
            self.processError( error )

(processError 和 processOutput 打印到屏幕并附加到日志文件。)

当进程启动时,它会生成几行 STDERR,然后开始每秒向 STDOUT 吐出一到三行。至少,应该是这样。相反,当错误停止出现时,上面的循环仅在“error = self.stderr.readline().rstrip()”处停止并等待更多错误。该进程继续运行(在我的测试中,它运行了几个小时),当它完成时,它会生成更多行 STDERR,这些行被捕获 - 但 STDOUT 的信息完全丢失。

如果我将 STDERR 路由到 STDOUT 而不是 PIPE,则它可以正常工作(但我无法区分 STDOUT 和 STDERR。)

如果我将 STDERR 处理器放在自己的线程中,一旦错误停止出现,整个进程就会停止。

似乎我需要找到一种从 STDERR 读取数据的方法,如果没有数据,则返回空白,我认为“error = self.stderr.readline().rstrip()”做到了。

python-3.x popen
1个回答
0
投票

好吧,我完全被难住了,但它正在起作用。我把双线程解决方案(这实际上是我开始的地方)放回原处,这样我就可以复制粘贴来向上面的评论者演示,但是......现在它正在工作。

© www.soinside.com 2019 - 2024. All rights reserved.