【问题标题】:When do I call flush() when dup'ing file descriptors?复制文件描述符时何时调用flush()?
【发布时间】:2013-03-30 15:35:47
【问题描述】:

当我调用 python 包装的 C++ 时,我有一个包装器来重定向输出。

基本思想是使用dupdup2,这是我能够从C++ 中捕获printf 输出的唯一方法。只要我以交互方式运行作业,包装器就可以正常工作,无需调用flush(),但是当我将作业发送到 TORQUE 批处理时,我再次得到不受欢迎的输出。

我的理解,部分来自this question,是一些适当的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)

【问题讨论】:

    标签: python io-redirection torque


    【解决方案1】:

    Python 在连接到 TTY 时应用行缓冲,否则需要更大的缓冲区。

    将 Python 程序重定向到管道意味着没有 TTY 连接到流,即使发送换行符,您也必须使用 .flush()

    您可以使用-u 运行Python 来关闭stdout 的缓冲。

    【讨论】:

    • 我不明白我要打多少次flush()。我链接到的示例将其称为 before 重复,而我希望您在设置流 back 之前调用flush(),因为我想避免使用缓冲区转储到原始输出/错误流中。
    猜你喜欢
    • 1970-01-01
    • 2012-07-15
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 1970-01-01
    • 2019-07-01
    • 2018-02-24
    相关资源
    最近更新 更多