我对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上尝试过这个。
答案 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))