我有一个要通过子进程启动的程序.除了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.pipe
、os.dup2
和os.read
,并且需要了解底层系统原语:
pipe(2)
、dup2(2)
、read(2)
、fork(2)
和execve(2)
.
现在可能是投资Advanced Programming in the Unix Environment副本的好时机.