python-如何捕获除stdout / stderr以外的子进程的输出?

我有一个要通过子进程启动的程序.除了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.

解决方法:

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

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

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

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

上一篇:Python执行Linux系统命令的4种方法-转发的


下一篇:Python3:超出资源限制时发生异常还是返回代码?