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:
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!")
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!