0
1

More than 1 year has passed since last update.

【Python】標準出力の出力先をファイルにする。

Last updated at Posted at 2022-12-08

はじめに

僕はiOSのPythonista3というAppで、よく寝っ転がりながらPythonするのですが、モジュールのヘルプを見ても英語がわからないのでGoogle翻訳が欠かせません。
一度、調べたこともすぐに忘れてしまうので、原文と翻訳テキストを保存しておくことにしました。

モジュールをインポートしてhelp(モジュール)と入力し、コンソールに出力されるテキストを「すべて選択」し、エディタに張り付けるという作業なのですが、文字数が大きいと選択に時間がかかり、時にはAppが落ちてしまいます。

僕は寝っ転がりながら「コンソールに出力されるテキストを直接ファイルに書き込めたらいいのになぁ。」と普通に思いました。

結論から

Python3
import sys

STDOUT = sys.stdout

sys.stdout = open('./tmp.txt', 'w')

help(sys)
 
sys.stdout = STDOUT

pythonの標準出力の出力先はsys.stdoutになっていて、これを書き換えることで出力先を変更できるそうです。

  1. まずは、もとに戻れるようにsys.stdoutSTDOUT にとっておきます。
  2. 出力先をファイルに変えます。
  3. 出力します。
  4. sys.stdoutをもとに戻します。

__stdout__では戻らない

まずは、多くの方が紹介している方法を試してみました。
sys.__stdout__でもとに戻す方法は、ファイルには出力されるのですが、コンソール出力にに戻らなくなってしまいました。

Python3
import sys

sys.stdout = open('./tmp.txt', 'w')

print("Hello")

sys.stdout = sys.__stdout__

print("World!")
tmp.txt
Hello
console

これが、メモに残そうとっしたきっかけなのですが、多くの記事でsys.__stdout__に戻すだけと紹介されていましたが、僕の環境ではうまく戻すことができませんでした。

ファイルには出力されているのですが、コンソールには何も表示されません。
一瞬、あせりましたが、Appを再起動したらもとに戻ってたので、「あせって損した」と思いながらドキュメントを見ることにしました。

Python 3.10.6 ドキュメント
sys --- システムパラメータと関数

sys.__stdin__
sys.__stdout__
sys.__stderr__

それぞれ起動時の stdin, stderr, stdout の値を保存しています。終了処理時に利用されます。また、 sys.std* オブジェクトが(訳注:別のファイルライクオブジェクトに)リダイレクトされている場合でも、実際の標準ストリームへの出力に利用できます。

また、標準ストリームが壊れたオブジェクトに置き換えられた場合に、動作する実際のファイルを復元するために利用することもできます。しかし、明示的に置き換え前のストリームを保存しておき、そのオブジェクトを復元る事を推奨します。

注釈 一部の条件下では、stdin, stdout, stderr も、オリジナルの stdin, stdout, stderr も None になることがあります。これはコンソールに接続しない Windows GUI アプリケーションであり、かつ pythonw で起動された Python アプリケーションが該当します。

つまり

寝っ転がるのをやめて、win10のコマンドプロンプトで試したら、sys.__stdout__で戻りました。
ついでに、PyhtonIDLEで試したら戻りませんでした。

つまり、「環境によってsys.__stdout__は使えない場合があるよ。」と理解しました。

参考にさせていただきました。

sys --- システムパラメータと関数 — Python 3.10.6 ドキュメント

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1