ホームページ  >  記事  >  バックエンド開発  >  システム コール出力を含む Python の sys.stdout をログ ファイルに複製する方法

システム コール出力を含む Python の sys.stdout をログ ファイルに複製する方法

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-27 06:04:14354ブラウズ

How to Duplicate Python's sys.stdout to a Log File, Including System Call Output?

sys.stdout をログ ファイルに複製する

このプログラミングの難問の目標は、Python アプリケーションからのすべての出力を複製することです。システム コールの出力は別のログ ファイルに記録されます。ただし、このタスクはユーザーにとって困難であることがわかっています。

最初、ユーザーは dup2 呼び出しの順序を逆にすることで解決策を試みましたが、無駄でした。以下のコードは、失敗した試みを示しています。

import os, sys

so = se = open("a.log", 'w', 0)
sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)

os.dup2(sys.stdout.fileno(), so.fileno())
os.dup2(sys.stderr.fileno(), se.fileno())

print("foo bar")

os.spawnve("P_WAIT", "/bin/ls", ["/bin/ls"], {})
os.execve("/bin/ls", ["/bin/ls"], os.environ)

このアプローチでは、ファイル "a.log" には画面に表示されているのと同じ出力が含​​まれているはずですが、含まれていません。

解決策

幸いなことに、この問題には解決策があります。以下のコードは、指定されたログ ファイルに sys.stdout を正常に複製する 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 インスタンスを作成し、ログ ファイルの名前とモードを指定できます。その後、sys.stdout が Tee インスタンスにリダイレクトされ、画面上の出力を維持しながら、すべての出力がログ ファイルに効果的に複製されます。

以上がシステム コール出力を含む Python の sys.stdout をログ ファイルに複製する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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