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