python - 复制文件描述符时什么时候调用flush()?

标签 python io-redirection torque

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

基本思想是使用 dupdup2,这是我能够捕获 printf 输出的唯一方法C++。只要我以交互方式运行作业,包装器就可以正常工作,无需调用 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 在连接到 TTY 时应用行缓冲,否则需要更大的缓冲区。

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

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

关于python - 复制文件描述符时什么时候调用flush()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15720273/

相关文章:

hpc - 同时执行多个 qsub 命令

python - 在 python 中填充列表

shell - 在文件中查找并替换并覆盖文件不起作用,它会清空文件

linux - Torque:作业执行的 UID 错误 MSG

bash - 我应该使用什么方法在 bash 脚本中使用 'stderr' 将错误消息写入 'printf'?

python - 将 python 函数的输出从 STDOUT 重定向到 Python 中的变量

csh - 如何在 PBS 扭矩中使用 qsub -v 命令?

python - "preparing documents"挂起 - Sphinx 中的 toctree 循环引用

python - 使用键盘移动图像

python - 图例标记透明度 - Matplotlib