我正在开发一个包装器脚本,用于调用Ninja c / c ++构建系统,脚本是python,它应该做的一件事就是记录Ninja和底层编译器的输出,但不要压抑标准输出。
给我带来麻烦的部分是Ninja似乎发现它正在写入终端,所以简单地捕获输出并将其发送到标准输出最终会改变它(最值得注意的是,Ninja没有填满屏幕使用警告列表和无错误的构建文件,但删除上一个成功构建的翻译单元的行,因为新的翻译单元会进入。有没有办法让Ninja写入终端,同时仍然捕获其输出?写入终端应该在Ninja子进程运行时发生,但捕获所述输出可能要等到子进程完成。
答案 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)