Rumah > pembangunan bahagian belakang > Tutorial Python > 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
Lepaskan: 2024-11-27 06:04:14
asal
376 orang telah melayarinya

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)
Salin selepas log masuk

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()
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan