ホームページ >バックエンド開発 >Python チュートリアル >インタラクティブ モードとデーモン モードの両方で Python の sys.stdout をログ ファイルに複製するにはどうすればよいですか?
sys.stdout をログ ファイルに複製する
sys.stdout をログ ファイルに複製すると、システム コールを含むすべての出力をキャプチャできます。 、Python アプリケーションから。このタスクは単純であるにもかかわらず、アプリケーションがインタラクティブ モードとデーモン モードの両方で動作する場合に特有の課題を引き起こします。
インタラクティブ モードとデーモン モード
インタラクティブ モードでは、出力を受け取る画面とログ ファイルの両方。ただし、デーモン モードでは、すべての出力がログ ファイルに送られる必要があります。 os.dup2() 関数は、デーモン モードで出力をリダイレクトする場合にはうまく機能しますが、システム コールを変更せずに対話モードで出力を複製するための簡単な解決策は提供しません。
Tee を使用した複製
この問題を解決するには、標準出力をログ ファイルに複製する方法を提供する Tee クラスを使用できます。以下に例を示します。
class Tee(object): def __init__(self, name, mode): self.file = open(name, mode) self.stdout = sys.stdout sys.stdout = self def __del__(self): sys.stdout = self.stdout self.file.close() def write(self, data): self.file.write(data) self.stdout.write(data) def flush(self): self.file.flush()
このクラスを使用すると、ログ ファイル名とモードをパラメータとして受け取る Tee インスタンスを作成できます。 write() メソッドは、出力をログ ファイルと標準出力の両方に複製します。
実装例
Tee クラスを使用するには:
with Tee('logfile.txt', 'w') as tee: print('Hello world!') os.system('ls -la')
この例では、「ls -la」へのシステムコールを含むすべての出力が画面とログの両方に書き込まれます。 file 'logfile.txt'.
このソリューションは、個々のシステム コールを変更する必要がなく、システム コール出力を含むすべての出力を効果的にログに記録します。
以上がインタラクティブ モードとデーモン モードの両方で Python の sys.stdout をログ ファイルに複製するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。