ホームページ >バックエンド開発 >Python チュートリアル >インタラクティブ モードとデーモン モードの両方で Python の sys.stdout をログ ファイルに複製するにはどうすればよいですか?

インタラクティブ モードとデーモン モードの両方で Python の sys.stdout をログ ファイルに複製するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-01 12:23:11735ブラウズ

How Can I Duplicate Python's sys.stdout to a Log File in Both Interactive and Daemon Modes?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。