Output Langsung daripada Perintah Subproses
Apabila menggunakan subproses.Popen untuk melaksanakan arahan luaran, ia menjadi mencabar untuk mendapatkan kedua-dua penstriman dan output output langsung storan untuk pengelogan dan semakan ralat. Artikel ini meneroka teknik untuk menangani isu ini, menyediakan penyelesaian yang secara serentak menangkap dan memaparkan output dalam masa nyata sambil mengekalkan keupayaan untuk menulisnya ke fail log.
Penyelesaian 1: Pendekatan Berasaskan Iterator
Satu kaedah melibatkan mencipta iterator daripada fungsi baca dan menulis output kepada kedua-dua output standard dan log fail:
import subprocess import sys with open("log.txt", "wb") as f: process = subprocess.Popen(your_command, stdout=subprocess.PIPE) for c in iter(lambda: process.stdout.read(1), b""): sys.stdout.buffer.write(c) f.buffer.write(c)
Dalam Python 3, gantikan "w" dengan "wb" untuk menyokong penulisan binari.
Penyelesaian 2: Pendekatan Fail Pembaca dan Penulis
Sebagai alternatif, fail pembaca dan penulis boleh digunakan untuk memisahkan stdout dan fail penulisan:
import io import subprocess import sys filename = "log.txt" with io.open(filename, "wb") as writer, io.open(filename, "rb", 1) as reader: process = subprocess.Popen(command, stdout=writer) while process.poll() is None: sys.stdout.write(reader.read()) time.sleep(0.5) # Read the remaining sys.stdout.write(reader.read())
Kaedah ini memastikan data ditulis pada kedua-dua output standard dan fail log, sambil menawarkan kelebihan membaca dan menulis tak segerak.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menangkap dan Log Output Langsung secara serentak daripada Subproses dalam Python?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!