>백엔드 개발 >파이썬 튜토리얼 >C 프로그램에서 출력을 읽을 때 Python 하위 프로세스가 중단되는 이유는 무엇입니까?

C 프로그램에서 출력을 읽을 때 Python 하위 프로세스가 중단되는 이유는 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-19 00:57:02770검색

Why Does My Python Subprocess Hang When Reading Output from a C Program?

Python C 프로그램 하위 프로세스가 "for line in iter"에서 중단됩니다.

하위 프로세스를 사용하여 Python에서 C 프로그램을 실행하는 것은 Python에서 출력을 읽을 때 까다로울 수 있습니다. C 프로그램. 이 경우 Python 스크립트는 "for line in iter(process.stdout.readline, '')"에서 정지됩니다.

문제 이해: 버퍼링

여기서 문제는 버퍼링입니다. 기본적으로 C 프로그램은 파이프에 쓸 때 stdout에 블록 버퍼링을 사용합니다(Python에서 프로그램을 실행할 때와 마찬가지로). 이는 버퍼가 가득 차거나 프로그램이 종료될 때까지 데이터가 플러시되지 않음을 의미합니다.

문제 해결

이 문제를 해결하는 방법에는 여러 가지가 있습니다.

1. C 프로그램 수정:

setvbuf(stdout, (char *) NULL, _IOLBF, 0); 추가 C 프로그램 시작 부분에서 라인 버퍼링을 강제합니다. 그러면 각 줄바꿈 이후에 버퍼가 플러시됩니다.

2. stdbuf 도구 사용:

stdbuf 도구를 통해 C 프로그램의 stdout을 리디렉션하여 버퍼링 동작을 제어합니다. 예:

import subprocess

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

3. 의사 TTY 사용:

의사 TTY를 사용하여 C 프로그램에 대한 대화형 터미널 환경을 시뮬레이션합니다. 이렇게 하면 프로그램이 라인 버퍼링을 사용하게 됩니다.

import pexpect

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

4. 양쪽 끝에서 읽기:

C 프로그램의 stdout과 Python 스크립트의 stdin을 동시에 읽으려면 Python의 select 함수를 사용합니다. 이렇게 하면 C 프로그램이 출력을 생성하지 않는 경우에도 Python 스크립트의 차단이 해제됩니다.

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

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