subprocess.Popen:stdin、stdout、stderr的不同缓冲?

3 投票
2 回答
1983 浏览
提问于 2025-04-16 15:23

我需要在调用 Popen 时设置 stderr 流为行缓冲。 我发现了 bufsize 这个参数,但它是对 stdinstdoutstderr 文件都适用的。

我该如何让每个文件的缓冲设置不同呢?

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

撰写回答