复制Python子进程的终端输出

时间:2013-12-13 14:24:46

标签: python linux subprocess

我正在开发一个包装器脚本,用于调用Ninja c / c ++构建系统,脚本是python,它应该做的一件事就是记录Ninja和底层编译器的输出,但不要压抑标准输出。

给我带来麻烦的部分是Ninja似乎发现它正在写入终端,所以简单地捕获输出并将其发送到标准输出最终会改变它(最值得注意的是,Ninja没有填满屏幕使用警告列表和无错误的构建文件,但删除上一个成功构建的翻译单元的行,因为新的翻译单元会进入。有没有办法让Ninja写入终端,同时仍然捕获其输出?写入终端应该在Ninja子进程运行时发生,但捕获所述输出可能要等到子进程完成。

1 个答案:

答案 0 :(得分:3)

pty.spawn()允许您将输出记录到文件中,同时将Ninja子流程误认为它适用于终端(tty):

import os
import pty

logfile = open('logfile', 'wb')

def read(fd):
    data = os.read(fd, 1024)
    logfile.write(data)
    return data

pty.spawn("ninja", read)