【问题标题】:subprocess.Popen: Different buffering for stdin, stdout, stderr?subprocess.Popen:stdin、stdout、stderr 的不同缓冲?
【发布时间】:2011-08-02 01:04:17
【问题描述】:

我需要在Popen 对行缓冲的调用中设置stderr 流。我发现了bufsize 参数,但它适用于所有stdinstdoutstderr 文件。

如何将每个文件的缓冲调整为不同?

【问题讨论】:

  • 这样的事情怎么样:out = subprocess.Popen(['ls'], stdout=subprocess.PIPE, bufsize=0) 然后,cat = subprocess.Popen(['ls'], stdin=out.stdout, stderr=subprocess.PIPE, bufsize=1)。在第一种情况下,stdout 是无缓冲的,而具有相同参数的 stderr 是行缓冲的。

标签: python python-3.x popen buffering


【解决方案1】:

我假设您将 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

【讨论】:

  • 好吧,我看不出有什么更好的办法了。谢谢。
  • 为什么要复制文件描述符?
【解决方案2】:

如果您最终还是打算将stdout/stderr 写入文件,并且只需要无缓冲的输出,则可以使用以下命令:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 2020-01-11
    • 2013-04-13
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 2011-10-30
    相关资源
    最近更新 更多