Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menduakan sys.stdout Python kepada Fail Log, Termasuk Output Panggilan Sistem?

Bagaimana untuk Menduakan sys.stdout Python kepada Fail Log, Termasuk Output Panggilan Sistem?

Patricia Arquette
Patricia Arquetteasal
2024-11-27 06:04:14354semak imbas

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

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn