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
Lepaskan: 2024-12-25 15:07:14
asal
263 orang telah melayarinya

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

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

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!

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