>  기사  >  백엔드 개발  >  계속해서 작성하는 C 프로그램에서 읽을 때 Python 'subprocess.readline'이 중단되는 이유는 무엇입니까?

계속해서 작성하는 C 프로그램에서 읽을 때 Python 'subprocess.readline'이 중단되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-19 16:09:03533검색

Why Does My Python `subprocess.readline` Hang When Reading from a Continuously Writing C Program?

Python 하위 프로세스 readline이 "for line in iter"에서 멈춤

문제

C 프로그램의 출력, 즉 "2000"을 읽으려고 할 때 ," 하위 프로세스를 사용하는 Python 스크립트에서 스크립트가 "for line in iter(process.stdout.readline, '')" 줄에서 중단됩니다. 이는 C 프로그램이 계속해서 "2000"을 인쇄하고 종료 상태에 도달하지 않음에도 불구하고 발생합니다.

해결 방법

이 문제는 블록 버퍼링 문제에서 비롯됩니다. 기본적으로 파이프를 통해 실행되는 C 프로그램(예: subprocess.Popen을 사용하는 경우)의 stdout은 블록 버퍼링됩니다. 이는 버퍼가 가득 차거나 명시적으로 플러시될 때까지 데이터가 파이프로 플러시되지 않음을 의미합니다.

옵션 1: C 프로그램 직접 수정

문제를 해결하려면 C 프로그램에서 stdout을 라인 버퍼링하도록 강제할 수 있습니다:

#include <stdio.h>

int main() {
    setvbuf(stdout, (char *) NULL, _IOLBF, 0); // Make line buffered stdout
    while (1) {
        printf("2000\n");
        sleep(1);
    }
    return 0;
}

옵션 2: stdbuf 유틸리티 사용

또는 stdbuf 유틸리티를 사용하여 C 프로그램 소스를 수정하지 않고 버퍼링 유형:

from subprocess import Popen, PIPE

process = Popen(["stdbuf", "-oL", "./main"], stdout=PIPE, bufsize=1)
for line in iter(process.stdout.readline, b''):
    print(line)
process.communicate()

옵션 3: 의사 TTY 사용

또 다른 접근 방식은 의사 TTY를 사용하여 C 프로그램을 속이는 것입니다. 대화형으로 실행된다고 생각해보세요:

import os
import pty
import sys
from select import select
from subprocess import Popen, STDOUT

master_fd, slave_fd = pty.openpty()
process = Popen("./main", stdin=slave_fd, stdout=slave_fd, stderr=STDOUT,
                bufsize=0, close_fds=True)
timeout = .1
with os.fdopen(master_fd, 'r+b', 0) as master:
    input_fds = [master, sys.stdin]
    while True:
        fds = select(input_fds, [], [], timeout)[0]
        # Handle subprocess output and user input here

옵션 4: pexpect 사용

Pexpect는 의사 TTY 처리를 단순화하는 상위 수준 인터페이스를 제공합니다.

import pexpect

child = pexpect.spawn("./.main")
for line in child:
    print(line)
child.close()

위 내용은 계속해서 작성하는 C 프로그램에서 읽을 때 Python 'subprocess.readline'이 중단되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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