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