Hentikan Membaca Output Proses dalam Python Tanpa Hang
Apabila menggunakan os.popen() untuk menangkap output proses, atur cara boleh hang jika proses secara berterusan mengeluarkan data. Untuk menangani isu ini, pertimbangkan untuk menggunakan kaedah alternatif seperti:
Menggunakan Subproses dan Benang
Mulakan proses dengan subproses. Buka, buat urutan untuk membaca output, dan simpan dalam baris gilir. Tamatkan proses selepas tamat masa tertentu.
<code class="python">import subprocess import threading import time def read_output(process, append): for line in iter(process.stdout.readline, ""): append(line) def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) try: q = collections.deque(maxlen=200) t = threading.Thread(target=read_output, args=(process, q.append)) t.daemon = True t.start() time.sleep(2) finally: process.terminate() print(''.join(q))</code>
Menggunakan Pengendali Isyarat
Gunakan signal.alarm() untuk menimbulkan pengecualian selepas tamat masa yang ditentukan. Ini memaksa proses untuk ditamatkan, membolehkan output ditangkap.
<code class="python">import signal import subprocess import time def alarm_handler(signum, frame): raise Alarm def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) signal.signal(signal.SIGALRM, alarm_handler) signal.alarm(2) q = collections.deque(maxlen=200) try: for line in iter(process.stdout.readline, ""): q.append(line) signal.alarm(0) except Alarm: process.terminate() finally: print(''.join(q))</code>
Menggunakan Pemasa
Gunakan threading.Pemasa untuk menamatkan proses selepas tamat masa.
<code class="python">import threading import subprocess def main(): process = subprocess.Popen(["top"], stdout=subprocess.PIPE, close_fds=True) timer = threading.Timer(2, process.terminate) timer.start() q = collections.deque(process.stdout, maxlen=200) timer.cancel() print(''.join(q))</code>
Alternatif Pendekatan
Perhatikan bahawa penyelesaian ini mungkin memperkenalkan tambahan masalah kerumitan atau keserasian. Pilih pendekatan yang paling sesuai dengan keperluan dan platform khusus anda.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menghalang Program Python daripada Digantung Apabila Menangkap Output Proses Berterusan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!