Python C 프로그램 하위 프로세스가 "for line in iter"에서 중단됩니다.
Python 스크립트에서 C 프로그램을 실행하려고 하면 사용자가 다음과 같은 문제를 겪을 수 있습니다. Python 코드의 "for line in iter" 문에서 정지 문제가 발생합니다. 이는 하위 프로세스를 사용하여 C 프로그램의 출력을 읽을 때 발생합니다. 이 경우 "2000"을 계속 인쇄하는 테스트 프로그램입니다.
문제 이해
이 정지 동작의 근본 원인은 stdout 버퍼 관리에 있습니다. 기본적으로 C 프로그램은 블록 버퍼 출력을 생성합니다. 즉, 데이터가 큰 덩어리로 stdout에 기록됩니다. 하위 프로세스의 경우처럼 stdout이 파이프로 리디렉션되면 이 버퍼링으로 인해 출력 읽기가 지연될 수 있습니다.
해결책
1. C 프로그램 버퍼링 수정:
이 문제를 해결하려면 라인 버퍼링된 stdout을 사용하도록 C 프로그램을 수정하면 됩니다. 이렇게 하면 모든 새 줄이 즉시 플러시되어 버퍼 관련 지연이 제거됩니다.
2. 의사 TTY 사용:
대체 솔루션은 의사 터미널(pty)을 사용하는 것입니다. PTY는 C 프로그램에 의사 tty 인터페이스를 제공하여 C 프로그램이 대화형으로 실행되고 있다고 생각하도록 속입니다. 이는 자연스럽게 stdout의 라인 버퍼링을 가능하게 합니다.
3. 특수 유틸리티 사용:
stdbuf와 같은 유틸리티를 사용하면 소스 코드를 수정하지 않고도 하위 프로세스의 버퍼링 동작을 수정할 수 있습니다. 다음 Python 코드는 stdbuf를 사용하는 방법을 보여줍니다.
import subprocess process = subprocess.Popen(["stdbuf", "-oL", "./main"], stdout=PIPE, bufsize=1) for line in iter(process.stdout.readline, b''): print(line)
4. pexpect 사용:
Pexpect는 ptys 처리를 단순화하는 모듈입니다. 다음과 같이 사용할 수 있습니다.
import pexpect child = pexpect.spawn("./main") for line in child: print(line)
이러한 솔루션을 구현하면 Python 스크립트가 C 프로그램의 출력을 즉시 읽을 수 있습니다. 이는 "for line in iter" 문에서 발생하는 중단 문제를 해결합니다.
위 내용은 C 프로그램의 `stdout`에서 읽을 때 내 Python `하위 프로세스`가 정지되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!