我正在通过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)
答案 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
用作用户的区域设置字符编码的占位符。