Menduakan sys.stdout ke Fail Log
Dalam teka-teki pengaturcaraan ini, matlamatnya adalah untuk menduplikasi semua output daripada aplikasi Python, termasuk output panggilan sistem, ke fail log yang berasingan. Walau bagaimanapun, tugas ini telah terbukti mencabar bagi pengguna.
Pada mulanya, pengguna mencuba penyelesaian dengan membalikkan susunan panggilan dup2, tetapi tidak berjaya. Kod di bawah menunjukkan percubaan mereka yang tidak berjaya:
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)
Dengan pendekatan ini, fail "a.log" sepatutnya mengandungi output yang sama yang dipaparkan pada skrin, tetapi tidak.
Penyelesaian
Nasib baik ada penyelesaian untuk masalah ini. Kod di bawah menyediakan kelas yang dipanggil Tee yang berjaya menduplikasi sys.stdout kepada fail log yang ditentukan:
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()
Kelas ini membenarkan pengguna mencipta tika Tee dan menentukan nama dan mod fail log. Selepas itu, sys.stdout diubah hala ke contoh Tee, dengan berkesan menduplikasi semua output ke fail log sambil mengekalkan output pada skrin.
Atas ialah kandungan terperinci Bagaimana untuk Menduakan sys.stdout Python kepada Fail Log, Termasuk Output Panggilan Sistem?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!