Rumah > pembangunan bahagian belakang > Tutorial Python > Mengapa Python `subprocess.readline()` Hang Semasa Menstrim Output Ruby dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Python `subprocess.readline()` Hang Semasa Menstrim Output Ruby dan Bagaimana Saya Boleh Membetulkannya?

Linda Hamilton
Lepaskan: 2024-12-21 00:21:09
asal
229 orang telah melayarinya

Why Does Python `subprocess.readline()` Hang When Streaming Ruby Output, and How Can I Fix It?

Python subprocess Readlines() Menyebabkan Hangups in Stream

Matlamat kod adalah untuk menstrim fail Ruby dan mengeluarkan kandungannya secara beransur-ansur. Semasa aspek penstriman dicapai, menghadapi isu apabila readline() tergantung selama-lamanya, menghalang pelaksanaan selanjutnya.

Penerokaan Penyelesaian Berpotensi

Menggunakan pty adalah bergantung pada platform pendekatan yang menganggap Linux atau sokongan OS yang serasi. Walau bagaimanapun, mempertimbangkan kebimbangan keserasian merentas platform:

  • Diharapkan: Pustaka ini boleh menyediakan kaedah alternatif untuk mengurus interaksi proses.
  • stdbuf: Alat ini membenarkan penimbalan talian dalam mod tidak interaktif, membolehkan output.
  • Pendekatan pty yang diubah suai:

Satu penambahbaikan yang dicadangkan kepada pelaksanaan pty sedia ada:

import errno
import os
import pty
from subprocess import Popen, STDOUT

master_fd, slave_fd = pty.openpty()  # provide tty to enable line-buffering on ruby's side
proc = Popen(['ruby', 'ruby_sleep.rb'],
             stdin=slave_fd, stdout=slave_fd, stderr=STDOUT, close_fds=True)
os.close(slave_fd)
try:
    while 1:
        try:
            data = os.read(master_fd, 512)
        except OSError as e:
            if e.errno != errno.EIO:
                raise
            break  # EIO means EOF on some systems
        else:
            if not data:  # EOF
                break
            print('got ' + repr(data))
finally:
    os.close(master_fd)
    if proc.poll() is None:
        proc.kill()
    proc.wait()
print("This is reached!")
Salin selepas log masuk

Kesimpulan

Ketiga-tiga penyelesaian yang dicadangkan menangani isu tersebut dengan mendayakan penimbalan talian untuk output serta-merta, manakala pendekatan pty yang disemak memastikan pengendalian input dan output yang anggun sambil memaksimumkan keserasian platform.

Atas ialah kandungan terperinci Mengapa Python `subprocess.readline()` Hang Semasa Menstrim Output Ruby dan Bagaimana Saya Boleh Membetulkannya?. 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