하위 프로세스를 시작하고 각각 stdout
및 stderr
을 읽는 데 두 개의 스레드를 사용해야합니다.닫기 전에 파이프 (os.pipe) 플러시
다음 코드는 stdout
을 고려하고있다 :
def reader(rfd):
while True:
try:
data = os.read(rfd, bufsize)
except OSError:
break
else:
chomp(data)
rout, wout = os.pipe()
tout = threading.Thread(target=reader, args=(rout,))
tout.start()
subprocess.check_call(command, bufsize=bufsize, stdout=wout, stderr=werr)
os.close(wout)
os.close(rout)
tout.join()
코드는 작동, 나는 os.close(wout)
기능은 모든 데이터를 읽어 전에 독자 를 죽이는 것처럼 모든 데이터가 처리되는 것으로 나타났습니다 제외. 반면에, 내가 닫지 않으면 wout
나의 과정은 영원히 tout.join()
에 걸릴 것입니다.
내가 매우 나쁜 time.sleep(0.1)
을 넣었을 때 subprocess.check_call(...)
이 마술처럼 작동하기 때문에 이것은 버퍼링 문제라고 말할 수 있습니다.
기다리는 대신 플러시가 좋지만 파이프를 통해 os.fsync()
을 호출하면 OSError: [Errno 22] Invalid argument
이 표시됩니다.
os.pipe
으로 생성 된 파이프를 플러시하는 방법에 대한 힌트가 있습니까?
왜 전에 * 파이프를 닫는 * 스레드에 합류? – goncalopp
@goncalopp,'close'는'read'를 인터럽트합니다. 반대의 경우 스레드가 종료되지 않으므로 교착 상태가 발생합니다. – Dacav
'stdout = subprocess.PIPE'와 함께'subprocess.Popen'을 사용해 보셨나요? 또한 문제가되는 'rout'을 닫는 것이 아니라고 확신합니까? – Dunes