sys.stdout没有重新分配给sys .__ stdout__

时间:2012-10-04 01:55:45

标签: python python-3.x

我对Python很陌生,所以我还在学习语言。我遇到的一件事是重新分配sys.stdout来更改print的默认输出。所以我把它写成了一个测试:

import sys
sys.stdout = open('log.txt','a')
print('hey')
sys.stdout.close()
sys.stdout = sys.__stdout__
print('hi')

'嘿'被写入文件,但'hi'无处可见。但是,这可以按预期工作,并且'hey'被写入文件,'hi'被打印到控制台输出:

import sys
sys.__stdout__ = sys.stdout
sys.stdout = open(r'C:\Users\Vincent\Documents\Python\log.txt','a')
print('hey')
sys.stdout.close()
sys.stdout = sys.__stdout__
print('hi')

简而言之,这是一个并不重要的小问题,我只是想知道是否有一个明显的原因导致它不按预期的方式工作。我在Windows 7 Home Premium上使用IDLE和pyscripter在v3.2.3和我的便携式python v3.2.1上尝试过这个。

3 个答案:

答案 0 :(得分:2)

在IDLE中,sys.__stdout__是程序的原始标准输出 - 由于它不是控制台应用程序,因此无处可去。换句话说,IDLE本身已经用其他东西(它自己的控制台窗口)替换了sys.stdout,因此您可以通过将stdout替换为__stdout__来向后退两步。

答案 1 :(得分:1)

我会尝试这种解决方法(根本不使用sys.stdout,因为您的环境可能同时使sys.__stdout__old_stdout = sys.stdout sys.stdout = open('log.txt','a') print('hey') sys.stdout.close() sys.stdout = old_stdout 区分开来:

sys.stdout

备份{{1}}的引用似乎是最安全的方法。处理另一个略有不同的案例:stdout redirect from Jupyter notebook is landing in the terminal

答案 2 :(得分:0)

这里是一个上下文管理器,可以为您备份LogReg的旧状态,作为其他答案的补充。

就我个人而言,我在基于PyQt5的程序中使用它,只要应用程序正在运行,标准输出就会重定向到基于文本的小部件。关闭应用程序后,输出将重定向回我的IDE控制台。

sys.std<in|out|err>

用法:

import sys

class SysStdRedirection:
    """Any change done to `sys.std<in|out|err>` inside this context manager will
       be reverted upon exit."""

    def __init__(self):
        for x in ("stdin", "stdout", "stderr"):
            setattr(self, x, getattr(sys, x))

    def __enter__(self):
        pass

    def __exit__(self, error_type=None, value=None, traceback=None):
        for x in ("stdin", "stdout", "stderr"):
            setattr(sys, x, getattr(self, x))