파이썬으로 외부 명령 행 프로그램을로드하고 파이프를 통해 통신하려고합니다. progam은 stdin을 통해 텍스트 입력을 받고 stdout에 줄 단위로 텍스트 출력을 생성합니다. 통신은 select()를 사용하여 비동기 적이어야합니다.Python : select()가 파이프의 모든 입력을 알리지 않습니다.
문제는 프로그램의 모든 출력이 select()에 신호되지 않는다는 것입니다. 일반적으로 마지막 한두 줄의 신호가 보내지지 않습니다. 만약 select()가 타임 아웃을 리턴하고 파이프에서 읽으 려한다면 readline()은 프로그램에서 보낸 라인을 즉시 반환한다. 아래 코드를 참조하십시오.
프로그램이 출력을 버퍼링하지 않고 모든 출력을 텍스트 줄로 보냅니다. 다른 많은 언어와 환경에서 파이프를 통해 프로그램에 연결하는 것은 지금까지 잘 작동했습니다.
Mac OSX 10.6에서 Python 3.1 및 3.2를 사용해 보았습니다. 내부적으로 file.readlines([size])
루프와는 size
의 내부 버퍼를 채우기 위해 시도 번 이상 read()
콜 더 호출
import subprocess
import select
engine = subprocess.Popen("Engine", bufsize=0, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
engine.stdin.write(b"go\n")
engine.stdin.flush()
while True:
inputready,outputready,exceptready = select.select([engine.stdout.fileno()] , [], [], 10.0)
if (inputready, outputready, exceptready) == ([], [], []):
print("trying to read from engine anyway...")
line = engine.stdout.readline()
print(line)
for s in inputready:
line = engine.stdout.readline()
print(line)
완벽하게 작동합니다. 감사합니다. – StefanMK
기꺼이 도와 드리겠습니다! – samplebias