Rumah > pembangunan bahagian belakang > Tutorial Python > Bagaimana untuk Mencapai Bacaan Paip Subproses Tidak Menyekat dalam Python?

Bagaimana untuk Mencapai Bacaan Paip Subproses Tidak Menyekat dalam Python?

Linda Hamilton
Lepaskan: 2024-12-17 05:30:25
asal
969 orang telah melayarinya

How to Achieve Non-Blocking Subprocess Pipe Reads in Python?

Cara Melakukan Bacaan Tidak Sekat pada Paip Subproses dalam Python

Apabila bekerja dengan modul subproses dalam Python, anda mungkin perlu melaksanakan bacaan tanpa sekatan pada aliran keluaran subproses. Ini memastikan program tidak menyekat apabila membaca daripada proses yang mungkin tidak mempunyai sebarang data.

Bacaan Penyekatan Tradisional

Lazimnya, kod berikut ialah digunakan untuk membaca daripada output standard subproses:

p = subprocess.Popen('myprogram.exe', stdout = subprocess.PIPE)
output_str = p.stdout.readline()
Salin selepas log masuk

Walau bagaimanapun, pendekatan ini menyekat pelaksanaan program sehingga data tersedia pada output standard.

Bacaan Tanpa Sekat

Untuk melaksanakan bacaan tanpa sekatan, satu kaedah biasa ialah menggunakan kelas Queue daripada Python modul giliran. Berikut ialah contoh:

import sys
from subprocess import PIPE, Popen
from threading  import Thread
try:
    from queue import Queue, Empty
except ImportError:
    from Queue import Queue, Empty  # python 2.x

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()

# ... do other things here

# read line without blocking
try:  line = q.get_nowait() # or q.get(timeout=.1)
except Empty:
    print('no output yet')
else: # got line
    # ... do something with line
Salin selepas log masuk

Dalam kod ini, fungsi enqueue_output berjalan dalam utas yang berasingan dan 不断地将 output从subprocess stdout放入队列中。主线程可以鰚程可以鰚(no.来检查队列中是否有数据.如果没有数据,它将引发 Kosong异常,而如果成功,它将返回提取的行。

Atas ialah kandungan terperinci Bagaimana untuk Mencapai Bacaan Paip Subproses Tidak Menyekat dalam Python?. 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