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
346 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!

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