Rumah >pembangunan bahagian belakang >Tutorial Python >Bagaimanakah Saya Boleh Mencapai Bacaan Tidak Menyekat daripada Output Standard Subproses?

Bagaimanakah Saya Boleh Mencapai Bacaan Tidak Menyekat daripada Output Standard Subproses?

Linda Hamilton
Linda Hamiltonasal
2024-12-25 15:07:14295semak imbas

How Can I Achieve Non-Blocking Reads from a Subprocess's Standard Output?

Bacaan Tidak Menyekat untuk Output Standard Subproses

Apabila menggunakan modul subproses untuk memulakan subproses dan menyambung kepada aliran keluaran standard mereka, ia adalah penting untuk melaksanakan bacaan tanpa sekatan untuk mengekalkan responsif program. Artikel ini menyelidiki teknik untuk mencapai bacaan tidak menyekat pada output standard subproses atau menilai ketersediaan data sebelum menggunakan .readline.

Pendekatan Penyekatan Tradisional

Biasanya, membaca terus output standard disekat, bermakna pelaksanaan dihentikan sehingga data tersedia. Ini ditunjukkan di bawah:

import subprocess

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()

Walau bagaimanapun, dalam pendekatan ini, pelaksanaan akan terhenti jika tiada data serta-merta hadir dalam strim.

Mengatasi Menyekat Bacaan dengan Queue.get_nowait ()

Untuk memintas menyekat bacaan, pendekatan merentas platform yang boleh dipercayai ialah untuk menggunakan modul Queue dan kaedah get_nowait()nya. Kaedah ini dengan anggun mengendalikan ketiadaan data dalam strim, membenarkan bacaan tanpa sekatan:

import sys
from subprocess import PIPE, Popen
from threading  import Thread
from queue import Queue, Empty

ON_POSIX = 'posix' in sys.builtin_module_names

def enqueue_output(out, queue):
    for line in iter(out.readline, b''):
        queue.put(line)
    out.close()

p = Popen(['myprogram.exe'], stdout=PIPE, bufsize=1, close_fds=ON_POSIX)
q = Queue()
t = Thread(target=enqueue_output, args=(p.stdout, q))
t.daemon = True # thread dies with the program
t.start()

try:  line = q.get_nowait()
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line

Dalam pendekatan ini, urutan yang berasingan dihasilkan untuk terus beratur keluaran daripada output standard subproses ke dalam baris gilir. Benang utama kemudiannya boleh melakukan bacaan tanpa sekatan dengan memanggil get_nowait(). Jika baris gilir kosong, panggilan kembali tanpa menyekat, membenarkan urutan utama diteruskan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Bacaan Tidak Menyekat daripada Output Standard Subproses?. 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