我有一个程序,我想通过子进程启动。它可以输出到除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。
答案 0 :(得分:3)
如果程序在开始运行后打开文件描述符9(或其他),则无法执行您想要的操作。
如果程序不打开文件描述符9本身,但是从父进程获取它,那么你可以使用preexec_fn
参数subprocess.Popen
执行所需的操作,但它并不像设置StringIO
实例那么简单。您必须手动创建管道,并且必须安排及时读取它,否则将导致死锁。期望编写两三百行代码以使这100%正确。我不会在这里放任何示例代码,因为我不想让它看起来比它更容易。
除了subprocess.Popen
之外,您还需要os.pipe
,os.dup2
和os.read
,您需要了解基础系统原语:
pipe(2)
,dup2(2)
,read(2)
,fork(2)
和execve(2)
。
现在可能是投资Advanced Programming in the Unix Environment副本的好时机。