>백엔드 개발 >파이썬 튜토리얼 >Ruby 출력을 스트리밍할 때 Python `subprocess.readline()`이 중단되는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Ruby 출력을 스트리밍할 때 Python `subprocess.readline()`이 중단되는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-21 00:21:09231검색

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

Python 하위 프로세스 Readlines()로 인해 스트림 중단 발생

코드의 목표는 Ruby 파일을 스트리밍하고 해당 내용을 점진적으로 출력하는 것입니다. 스트리밍 측면이 달성되는 동안 readline()이 무기한 중단되어 추가 실행을 방지하는 문제가 발생합니다.

잠재적 솔루션 탐색

pty 사용은 플랫폼에 따라 다릅니다. Linux 또는 호환 가능한 OS 지원을 가정하는 접근 방식입니다. 그러나 크로스 플랫폼 호환성 문제를 고려하면:

  • Pexpect: 이 라이브러리는 프로세스 상호 작용을 관리하는 대체 방법을 제공할 수 있습니다.
  • stdbuf: 이 도구는 비대화형 모드에서 라인 버퍼링을 허용하여 즉각적인 활성화를 가능하게 합니다. 출력.
  • 수정된 pty 접근 방식:

기존 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.