subprocess.Popen:stdin、stdout、stderr的不同缓冲?
我需要在调用 Popen
时设置 stderr
流为行缓冲。 我发现了 bufsize
这个参数,但它是对 stdin
、stdout
和 stderr
文件都适用的。
我该如何让每个文件的缓冲设置不同呢?
2 个回答
1
如果你打算最后把 stdout
(标准输出)和 stderr
(标准错误)写入一个文件,并且你只需要输出是实时的(也就是不经过缓存),你可以使用以下方法:
LOG_FILE = codecs.open('somelog.txt', 'a', 'utf_8', buffering=0)
subprocess.Popen(ARGS, stdout = LOG_FILE, stderr = LOG_FILE).communicate()
这样的话,使用的缓存方式就是文件的缓存,这里就是:没有缓存。
3
我猜你是用PIPE来处理错误信息的,对吧?如果是这样的话,我觉得你可以试试下面这种方法:
p = subprocess.Popen(..., stderr=subprocess.PIPE)
fd = p.stderr.fileno()
my_stderr = os.fdopen(os.dup(fd), 'rU', new_bufsize)
os.close(fd)
# use my_stderr from here on