subprocess.Popen:标准输入、输出和错误输出的不同缓冲方式?

3
我需要在使用Popen时将stderr流设置为行缓冲。我发现了bufsize参数,但它适用于所有的stdinstdoutstderr文件。
我如何调整每个文件的缓冲区大小?

1
这样怎么样:out = subprocess.Popen(['ls'], stdout=subprocess.PIPE, bufsize=0),然后,cat = subprocess.Popen(['ls'], stdin=out.stdout, stderr=subprocess.PIPE, bufsize=1)。在第一个例子中,stdout 是无缓冲的,而具有相同参数的 stderr 是行缓冲的。 - user225312
2个回答

3
我假设您使用PIPE来处理stderr?在这种情况下,我认为您可以像这样操作:
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

我没有看到更好的方法来做这件事。谢谢。 - Matt Joiner
为什么要复制文件描述符? - Lucas Cimon

1

如果您最终打算将 stdout/stderr 写入文件,并且只需要输出不缓冲,那么可以使用以下方法:

LOG_FILE = codecs.open('somelog.txt', 'a', 'utf_8', buffering=0)

subprocess.Popen(ARGS, stdout = LOG_FILE, stderr = LOG_FILE).communicate()

那么使用的缓冲区将是文件的缓冲区,在这种情况下:没有缓冲。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接