verilog書く人

自称ASIC設計者です。どなたかkaggle一緒に出ましょう。

雑記:IDE使用時にPythonで標準出力をリダイレクトした時のちょっとしたトラブルシューティング

Pythonでは標準出力(いわゆるprint関数の中に入れると文字がコンソールに出ちゃう奴)の出力先をファイルに変える(=リダイレクトする)のも簡単だ。

 

↑このへんを参考にしつつ

>>> import sys
>>> sys.stdout = open('out.txt', 'w')
>>> print('uwaaaaa')

と書くだけで、コンソールにuwaaaaaと表示される代わりに、out.txtと言うファイルが実行ディレクトリで作成され、その中にuwaaaaaというメッセージが書き込まれるのである。

標準出力をコンソールに戻すのも基本的には簡単でsys.stdoutにsys.__stdout__を代入してやればよい。すなわち、

>>> import sys
>>> sys.stdout = open('out.txt', 'w')
>>> print('uwaaaaa')
>>> sys.stdout = sys.__stdout__
>>> print('yamerooooo')

と実行するとuwaaaaaはout.txtに表示されるが、yameroooはコンソールに表示されるのである。

 

ところが、コマンドプロンプトなどからPythonを実行していない場合、例えば、PyscripterなどのIDE上でPythonを実行していると、uwaaaaaはout.txtに表示されるが、yameroooはどこにも表示されないことに気づいた。

これについて調べてみるとどうもPyscripterではsys.__stdout__ではなく別の標準出力を最初から使っている事が原因のようだ↓

https://groups.google.com/forum/#!topic/pyscripter/rhtXtinfmGM

 

Pyscripter固有の解決法を施して、他の環境では動かないコードが入るのは避けたいしな、、と悩んでいたが、シンプルにsys.stdoutの初期の実体が何であれ、それを一時的に確保して後で用が済んだら戻してやればよいと言うことに気づいた。

すなわち、

>>> import sys
>>> temp_sysout = sys.stdout >>> sys.stdout = open('out.txt', '
w') >>> print('uwaaaaa') >>> sys.stdout = temp_sysout >>> print('yamerooooo')

としてやればよい。これで「yamerooooo」はコンソールに表示されるのである。勿論IDEだけでなく、コマンドプロンプトでも動作する。