当我调用 python python-wrapped C++ 时,我有一个包装器来重定向输出。
基本思想是使用dup
and dup2
,这是我能够printf
从 C++ 捕获输出的唯一方法。flush()
只要我以交互方式运行作业,包装器就可以正常工作,无需调用,但是当我将作业发送到 TORQUE 批处理时,我再次得到不受欢迎的输出。
我的理解,部分来自这个问题,是一些适当的flush()
电话应该解决这个问题,但他们到底需要去哪里?我应该在复制到临时文件之前刷新缓冲区吗?在复制回来之前?两个都?
我使用的包装如下:
class Filter(object):
"""
Workaround filter for annoying and worthless errors.
"""
def __init__(self, veto_words={'ClassTable'}):
self.veto_words = set(veto_words)
self.temp = tempfile.NamedTemporaryFile()
def __enter__(self):
sys.stdout.flush() # <--- NEEDED?
sys.stderr.flush() # <--- NEEDED?
self.old_out, self.old_err = os.dup(1), os.dup(2)
os.dup2(self.temp.fileno(), 1)
os.dup2(self.temp.fileno(), 2)
def __exit__(self, exe_type, exe_val, tb):
sys.stdout.flush() # <--- NEEDED?
sys.stderr.flush() # <--- NEEDED?
os.dup2(self.old_out, 1)
os.dup2(self.old_err, 2)
self.temp.seek(0)
for line in self.temp:
veto = set(line.split()) & self.veto_words
if not veto:
sys.stderr.write(line)