2012-10-04 24 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而向後退兩步。