2012-10-04 3 views
6

私はPythonには新しく、まだ言語を学んでいます。私が遭遇したことの1つは、sys.stdoutを再割り当てしてprintのデフォルト出力を変更することでした。だから私はテストとしてこれを書いた: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') 

本当に重要すぎてdoesntのその小さな問題、私はそれがどうやってしなければならないのか分からない理由があるのだろうかと疑問に思うだけです。私はこれをWindows 7 Home PremiumでIDLEとpyscripterでv3.2.3と私の移植可能なpython v3.2.1で試しました。

+0

このスクリプトをどのように実行しますか?あなたは最初の 'print'が働いたかどうかは分かりませんでした。 *最初にsys.stdoutに他の変数を代入して戻すと変更されます*これを示すコードを記述して出力を記述する方が良いでしょう。 –

答えて

0

(ご使用の環境がsys.stdoutと明確な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の参照をbackupingはそれを行うための最も安全な方法と思われます。若干異なる場合:stdout redirect from Jupyter notebook is landing in the terminal

2

IDLEでは、sys.__stdout__はプログラムのオリジナル標準出力です。これはコンソールアプリケーションではないためどこにもありません。つまり、IDLE自体は既にsys.stdoutを別のもの(独自のコンソールウィンドウ)に置き換えているため、自分自身のstdout__stdout__に置き換えて2つ前に戻っています。

関連する問題