2012-10-04 26 views
6

我对Python很新,所以我仍然只是在学习语言。我遇到的其中一件事是重新分配sys.stdout来更改打印的默认输出。所以我写了这个测试:sys.stdout不重新分配给sys .__ stdout__

import sys 
sys.stdout = open('log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = sys.__stdout__ 
print('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和v3.2.3上的pyscripter以及我的便携式python v3.2.1尝试了这一点。

+0

你如何运行这个脚本?你没有告诉第一个'print'是否起作用。 *当我在开始时将一些其他变量分配给sys.stdout并将其改回时,它将起作用*最好是编写说明这一点的代码并描述它的输出。 –

回答

0

我会尝试这种解决方法(不使用sys.__stdout__,因为在所有的环境可以做出既sys.stdoutsys.__stdout__不同):

old_stdout = sys.stdout 
sys.stdout = open('log.txt','a') 
print('hey') 
sys.stdout.close() 
sys.stdout = old_stdout 

backuping的sys.stdout参考似乎做它最安全的方式。在另一个稍微不同的情况下工作:stdout redirect from Jupyter notebook is landing in the terminal

2

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