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