Python Popen stderr捕获输出

时间:2015-02-16 22:15:26

标签: python subprocess popen stderr

我正在通过Popen运行命令并捕获stderr并使用它来更新其他地方的显示,这是正常工作,每次stderr输出时更新,但我也试图将输出实时保存到日志文件。虽然这确实将输出写入文件,但它似乎并不经常更新此文件。有没有办法在每次写入内容时都将输出写入文件? 这是代码:

self.process1 = Popen(command, startupinfo=startupinfo, stderr=subprocess.PIPE)
logFile = open(logFilePath, "a")
while True:
    line222 = self.process1.stderr.readline().decode('utf-8')
    logFile.write(line222)

2 个答案:

答案 0 :(得分:1)

for line in iter(self.process1.stderr.readline,b""):
    line222 = line.decode('utf-8')
    logFile.write(line222)
    logFile.flush()

答案 1 :(得分:0)

默认情况下,文件使用块缓冲,即在缓冲区溢出之前不会将任何内容写入磁盘。块大小通常为4K或8K字节。

在您的情况下,应该足以使文件行缓冲:

#!/usr/bin/env python
from __future__ import print_function
from subprocess import Popen, PIPE

p = Popen(command, startupinfo=startupinfo, 
          stderr=PIPE, bufsize=1,  # `1` means line-buffered (our end)
          universal_newlines=True) # convert to text, normalize newlines
with p.stderr, open(log_filename, "a", 1) as log_file: # `1` means line-buffered
    for line in iter(p.stderr.readline, ''):
        for file in [sys.stderr, log_file]:
            print(line, end='', file=file)
p.wait()

如果你使用的是Python 3,那么你在这里不需要iter()(那里修复了预读错误);您只能使用for line in pipe:

我认为您已将utf-8用作用户的区域设置字符编码的占位符。