3

我有一个程序,我想通过子进程启动。它可以输出到除 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。

4

1 回答 1

3

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

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

除了subprocess.Popen,您还需要os.pipeos.dup2、 和os.read,并且您需要了解底层系统原语: pipe(2)dup2(2)read(2)fork(2)execve(2)

现在可能是购买 Unix 环境中的高级编程副本的好时机。

于 2012-09-25T19:19:48.093 回答