如何捕获子进程的输出除了stdout / stderr?

时间:2012-09-25 19:00:52

标签: python subprocess

我有一个程序,我想通过子进程启动。它可以输出到除stdout和stderr之外的fd。有没有办法从任意fd捕获数据?如果我的进程将输出发送到fd 9,我想做类似以下的事情:

import subprocess, StringIO
redirector = StringIO.StringIO()
errno = subprocess.call(cmd, fd9=redirector)
#process the error code and data in redirector

想要通过stderr或stdout将被调用进程的输出重定向到fd 9。

1 个答案:

答案 0 :(得分:3)

如果程序在开始运行后打开文件描述符9(或其他),则无法执行您想要的操作。

如果程序打开文件描述符9本身,但是从父进程获取它,那么你可以使用preexec_fn参数subprocess.Popen执行所需的操作,但它并不像设置StringIO实例那么简单。您必须手动创建管道,并且必须安排及时读取它,否则导致死锁。期望编写两三百行代码以使这100%正确。我不会在这里放任何示例代码,因为我不想让它看起来比它更容易。

除了subprocess.Popen之外,您还需要os.pipeos.dup2os.read,您需要了解基础系统原语:  pipe(2)dup2(2)read(2)fork(2)execve(2)

现在可能是投资Advanced Programming in the Unix Environment副本的好时机。