stdin을 닫기 전에 Python 하위 프로세스 Popen readline
Sep 07 2020
import subprocess as sp
p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE)
p.stdin.write(b"foobaz!\n")
p.stdin.close()
print(p.stdout.readline())
이 코드는 예상대로 작동합니다 (cat이 stdin을 에코하고 stdout을 읽을 수 있음).
를 주석 처리 p.stdin.close()하면 .readline()블록이 무기한으로 표시됩니다. 이것은 .read(1)대신 동일한 호출로 작동합니다 . EOF를 stdin에 보내지 않고 하위 프로세스 모듈을 사용하여 readline하는 방법이 있습니까?
내 문제를 해결할 수있는 다른 라이브러리가 있다는 것을 알고 있으며 그 라이브러리도 조사하고 있습니다. 이 질문에 대해서는이 기능이 있는지, .NET subprocess을 통해이를 달성하는 방법 만 궁금합니다 subprocess.
답변
1 alani Sep 07 2020 at 12:28
문제는 버퍼링에 있습니다. bufsize=1다음을 사용 하는 경우에도 사용할 수 있습니다 universal_newlines=True(바이트 대신 문자열을 작성합니다).
p = sp.Popen("/bin/cat", stdin=sp.PIPE, stdout=sp.PIPE,
bufsize=1, universal_newlines=True)
p.stdin.write("foobaz!\n")
print(p.stdout.readline())
위의 내용은 Python 3.5.2에서 테스트되었습니다. 참고-관련없는 질문에 대한 답변을 읽었습니다. 최신 Python 버전 text=True에서와 동일 universal_newlines=True하지만 작성 시점에 시도해 볼 최신 설치가 없습니다.