>  기사  >  백엔드 개발  >  C 프로그램의 `stdout`에서 읽을 때 내 Python `하위 프로세스`가 정지되는 이유는 무엇입니까?

C 프로그램의 `stdout`에서 읽을 때 내 Python `하위 프로세스`가 정지되는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-18 05:07:02488검색

Why Does My Python `subprocess` Hang When Reading from a C Program's `stdout`?

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

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