Bagaimana untuk Mengelakkan Program Python Tergantung Semasa Membaca Output Proses Berterusan?

DDD
Lepaskan: 2024-11-01 09:47:02
asal
335 orang telah melayarinya

How to Avoid Python Programs Hanging When Reading Continuous Process Output?

Menghentikan Pembacaan Output Proses dalam Python Tanpa Hang

Latar Belakang

Apabila menggunakan fungsi os.popen() Python dengan alatan yang menghasilkan output berterusan, program sering digantung apabila cuba membaca output.

os.popen() Issue

Proses talian bermasalah = os.popen("top").readlines() menghentikan program kerana readlines(), yang cuba membaca keseluruhan output proses sekaligus.

Penyelesaian dengan subprocess.Popen()

Untuk menyelesaikan isu ini, gunakan subprocess.Popen() dan bukannya os.popen (). Berikut ialah contoh yang diperbetulkan:

<code class="python">import subprocess
import time
import os

# Start "top" process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Wait for 2 seconds
time.sleep(2)

# Send kill signal to "top" process
os.popen("killall top")

# Read process output
output, _ = process.communicate()
print(output.decode())</code>
Salin selepas log masuk

Kod yang diubah suai ini:

  • Merakam output proses dalam pembolehubah menggunakan communicate() dan bukannya readlines().
  • Menghantar isyarat bunuh ke proses "atas".
  • Mengisytiharkan tamat fail untuk strim I/O proses dan keluar dari program.

Pendekatan Seperti Ekor

Jika anda hanya memerlukan sebahagian daripada output proses, anda boleh menggunakan penyelesaian seperti ekor untuk menangkap bilangan baris tertentu.

Pendekatan Berasaskan Benang

Untuk menangkap proses output dalam urutan berasingan, cuba yang berikut:

<code class="python">import collections
import subprocess
import threading

# Start process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Define function to read process output in a thread
def read_output(process):
    for line in iter(process.stdout.readline, ""):
        ...  # Implement your logic here to process each line

# Create and start a thread for reading and processing output
reading_thread = threading.Thread(target=read_output, args=(process,))
reading_thread.start()

# Wait for 2 seconds, then terminate the process
time.sleep(2)
process.terminate()

# Wait for the reading thread to complete
reading_thread.join()</code>
Salin selepas log masuk

pendekatan signal.alarm()

Anda juga boleh menggunakan signal.alarm() untuk menamatkan proses selepas tamat masa yang ditentukan:

<code class="python">import collections
import signal
import subprocess

# Define signal handler
def alarm_handler(signum, frame):
    # Raise an exception to terminate the process reading
    raise Exception

# Set signal handler and alarm for 2 seconds
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(2)

# Start process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Capture process output
number_of_lines = 200
q = collections.deque(maxlen=number_of_lines)
for line in iter(process.stdout.readline, ""):
    q.append(line)

# Cancel alarm
signal.alarm(0)

# Print captured output
print(''.join(q))</code>
Salin selepas log masuk

Penerasan.Pendekatan Pemasa

Sebagai alternatif, anda boleh menggunakan penjalinan.Pemasa untuk menjadualkan penamatan proses:

<code class="python">import collections
import subprocess
import threading

# Define function to terminate the process
def terminate_process(process):
    process.terminate()

# Start process with stdout redirection
process = subprocess.Popen(["top"], stdout=subprocess.PIPE)

# Create and start a timer to terminate process in 2 seconds
timer = threading.Timer(2, terminate_process, [process])
timer.start()

# Capture process output
number_of_lines = 200
q = collections.deque(process.stdout, maxlen=number_of_lines)

# Cancel timer
timer.cancel()

# Print captured output
print(''.join(q))</code>
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Program Python Tergantung Semasa Membaca Output Proses Berterusan?. 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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!