Python 하위 프로세스 Readlines()로 인해 스트림 중단 발생
코드의 목표는 Ruby 파일을 스트리밍하고 해당 내용을 점진적으로 출력하는 것입니다. 스트리밍 측면이 달성되는 동안 readline()이 무기한 중단되어 추가 실행을 방지하는 문제가 발생합니다.
잠재적 솔루션 탐색
pty 사용은 플랫폼에 따라 다릅니다. Linux 또는 호환 가능한 OS 지원을 가정하는 접근 방식입니다. 그러나 크로스 플랫폼 호환성 문제를 고려하면:
기존 pty 구현에 대한 개선 제안:
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!")
결론
제안된 세 가지 솔루션 모두 다음을 활성화하여 문제를 해결합니다. 즉각적인 출력을 위한 라인 버퍼링, 수정된 pty 접근 방식은 플랫폼 호환성을 최대화하는 동시에 입력 및 출력의 우아한 처리를 보장합니다.
위 내용은 Ruby 출력을 스트리밍할 때 Python `subprocess.readline()`이 중단되는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!