A. 標準ライブラリ
質問のコードのようなprintのリダイレクトは、Python3.4以降であれば
contextlib.redirect_stdout を使うとできますが、実行結果が表示されないのは同じです。
logging モジュールを使うと、複数の出力先を設定できます。
「シンプル」かどうかというと、十数行程度の初期設定は必要です。
print の出力先を logger に変更することもできますが、要件とは合わなさそう。
B. 外部ライブラリ
コマンドラインでの実行であれば、tee
コマンドでファイルと標準出力へ同時出力に使われますが
同様の役割を果たすライブラリがあります。
※ jupyter での挙動は確認してません。
サンプルコードは sys.stdout.write
で出力してますが、print
でも使えます。
C. IPython tee
IPython 内に同様のモジュールがあります。
print で使う為には標準ライブラリの redirect_stdout と併せて。
python
1from contextlib import redirect_stdout
2from IPython.utils.io import Tee
3
4with redirect_stdout(Tee("result.txt", "w", channel="stdout")):
5 for n in range(10):
6 print(n)
D. jupyter (notebook) magic commands
2つの cell に跨ります
方法1: 標準出力をキャプチャ & ファイルへ出力
%%capture result --no-stderr
標準入力のキャプチャ
%store result.stdout >result.txt
result.show()
方法2: ファイルに書き出して実行 (※ 要 tee コマンド)
%%writefile test.py
!python test.py | tee result.txt
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。