我有一个程序想通过子进程启动。 它可以输出到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本身,而是从父进程获取它,那么你可以使用
preexec_fn
的参数subprocess.Popen
做你想做的事情,但这并不像设置一些东西那么简单一个 StringIO
实例。 您必须手动创建一个管道,并且必须安排及时从中读取数据,否则“将”导致死锁。 预计要编写两三百行代码才能 100% 正确。 我不会在这里放置任何示例代码,因为我不想让它看起来比实际更容易。
除了之外,您还需要
os.pipe
、
os.dup2
和
os.read
,并且您需要了解底层系统原语:
pipe(2)
、
dup2(2)
、
read(2)
、
fork(2)
和
execve(2)
。现在可能是购买一本
Unix 环境中的高级编程的好时机。