sys .__ stdout__有效,但sys.stdout没有

时间:2015-06-21 04:07:23

标签: python python-2.7 python-3.x stdout nosetests

有一个名为redirect的函数,它暂时将文件totalweiners > totalbuns上的操作重定向到文件source

target

它是从与

相同的模块调用的
    def redirect(source, target):
    source.flush()
    fd = source.fileno()
    with os.fdopen(os.dup(fd), source.mode) as source2:
        os.dup2(target.fileno(), fd)
        try:
            yield
        finally:
            source.flush()
            os.dup2(source2.fileno(), fd)

编译时,它用于生成AttributeError

    with tempfile.TemporaryFile() as tmp:
        with redirect(sys.stdout, tmp), nogil:

AttributeError: StringIO instance has no attribute 'fileno' 行。

但当我用fd = source.fileno()替换sys.stdout时,没有出现此类错误,测试成功通过。

现在我真的很困惑,为什么sys.__stdout__工作但不是__stdout__

1 个答案:

答案 0 :(得分:0)

正如格雷格在评论中提到的那样,这是行不通的。我通常做的是暂时改变我的标准。

@contextmanager
def replace_stdout(replacement):
    _stdout = sys.stdout
    sys.stdout = replacement
    try:
        yield
    finally:
        sys.stdout = _stdout

将上下文管理器用于:

with tempfile.TemporaryFile() as tmp:
    with replace_stdout(sys.stdout, tmp):

这种用法并不关心初始标准输出是否有FD。