1. ホーム
  2. パイソン

[解決済み】Pythonでstdoutをファイルにリダイレクトする?

2022-03-25 18:21:19

質問

Pythonでstdoutを任意のファイルにリダイレクトするには?

長時間稼働するPythonスクリプト(Webアプリケーションなど)をsshセッション内から起動してバックグランドし、sshセッションを閉じると、stdoutに書き込もうとした瞬間にIOErrorが発生してアプリケーションは失敗してしまいます。IOErrorによる失敗を防ぐために、アプリケーションとモジュールをstdoutではなくファイルに出力させる方法を見つける必要がありました。現在、私は出力をファイルにリダイレクトするためにnohupを採用し、それは仕事を成し遂げますが、私は好奇心から、nohupを使用せずにそれを行う方法があるかどうか疑問に思っていました。

既に試したのは sys.stdout = open('somefile', 'w') が、これでは一部の外部モジュールがまだターミナルに出力するのを防げないようです(あるいは sys.stdout = ... の行は全く発火しませんでした)。もっとシンプルなスクリプトでテストしたことがあるので、うまくいくはずなのですが、ウェブアプリケーションでテストする時間がまだありませんでした。

解決方法は?

Pythonスクリプト内でリダイレクトを行う場合は、Pythonスクリプトに sys.stdout をファイルオブジェクトに設定することで、うまくいきます。

import sys
sys.stdout = open('file', 'w')
print('test')
sys.stdout.close()

はるかに一般的な方法は、実行時にシェルのリダイレクトを使う方法です(WindowsでもLinuxでも同じです)。

$ python foo.py > file