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

Vin*_*nce 7 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')
Run Code Online (Sandbox Code Playgroud)

'嘿'被写入文件,但'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')
Run Code Online (Sandbox Code Playgroud)

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

jas*_*per 7

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


Jea*_*bre 3

我会尝试这个解决方法(sys.__stdout__根本不使用,因为您的环境可能使两者sys.stdoutsys.__stdout__不同):

old_stdout = sys.stdout
sys.stdout = open('log.txt','a')
print('hey')
sys.stdout.close()
sys.stdout = old_stdout
Run Code Online (Sandbox Code Playgroud)

备份参考sys.stdout似乎是最安全的方法。在另一种稍微不同的情况下工作:来自 Jupyter 笔记本的 stdout 重定向正在登陆终端