質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

8590閲覧

jupyterlabで、実行結果をテキストファイルとして、自動で出力したい。実行結果は画面上に表示したままにしたい。

nemumi-nomaki

総合スコア20

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/06/04 16:33

前提・実現したいこと

jupyterlabで、実行結果をテキストとして自動で出力したいと考えています。
そこで、こちらの質問と同様、以下のようなコードを書きました。

import sys # 標準入力を挿げ替える sys.stdout = open('result.txt', 'w') for i in range(10): print(i) # 元に戻そう sys.stdout.close() sys.stdout = sys.__stdout__

これにより、実行結果をテキストとして出力することは出来ました。しかし、実行結果が画面上には表示されなくなってしまいました。
実行結果を画面上に表示したまま、実行結果をテキストとして出力する、シンプルな方法はありませんか?標準出力が複数指定できれば良いのですが...。
print(i)の部分は変更せずに、実現できると有難いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

投稿2021/06/05 03:36

teamikl

総合スコア8664

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

組み込み関数なので、出力先の変更は出来るようですが、増やせなさそうですね。
リファレンスを調べましたがそのような記述は見当たりません

組み込み関数 - Python 3.9.4ドキュメント
https://docs.python.org/ja/3/library/functions.html#print

なので、こちらの質問素直にファイル出力にする方法に手を加えるのが良いかと思います。

python

1import sys 2 3with open('result.txt', 'w') as f: 4 for i in range(10): 5 print(i, file=f) 6 print(i)

もし、print(i)を変えないでという縛り条件がなければ、関数化してしまうのも手かと思います。

python

1import sys 2 3def tee_print(msg, f): 4 print(msg, file=f) 5 print(msg) 6 7with open('result.txt', 'w') as f: 8 for i in range(10): 9 tee_print(i, f)

投稿2021/06/04 20:51

neonemo

総合スコア191

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問