2013-07-23 2 views
-1

현재 subprocess.check_output을 사용하여 많은 출력을 생성하는 외부 C++ 프로그램을 호출하고 로그 파일에 stdout을 저장합니다. 그러나 C++ 프로그램은 끝내기까지 오랜 시간이 걸릴 수 있지만, 마치 bash 명령 행을 통해 C++ 프로그램을 직접 실행하는 것처럼 마치기 전에 stdout을보고 싶습니다.파이썬에서 bash 명령을 호출 할 때 주기적으로 출력을 파일에 저장하십시오.

물론 출력을 저장하기 위해 fstream을 사용하여 내 C++ 프로그램을 직접 수정하여이 작업을 수행 할 수 있습니다. 하지만 파이썬에서 표준 출력을 가로 챌 수있는 솔루션이 있는지 궁금합니다.

미리 감사드립니다.

+0

'tee' 명령을 알고 있습니까? – hivert

+0

@hivert 물론 C++ 프로그램을 호출하는 명령에 'tee'를 추가 할 수 있습니다. 하지만 내 질문은 파이썬에서 그것을 달성하는 방법에 관한 것입니다. @ Frodon이 질문에 대답했다. 출력을 다룰 때'subprocess.check_output'을 사용하곤 했었지만'subprocess.call'에 대해서는'stdout = logfile'을 전혀 몰랐습니다. – Tevatron

답변

1

출력을 로그 파일에 저장하는 경우 subprocess.callstdout을 열린 로그 파일로 설정하면 어떻습니까?

with open("logfile") as logfile: 
    subprocess.call("run_my_program arg1 arg2", shell=True, stdout=logfile) 

그런 다음 간단한 tail -f logfile 프로그램을 실행하는 동안 당신에게 로그의 내용을 표시합니다.

+0

감사합니다 @Frodon 그 작품! 'stdout'은'subprocess.check_output'에서 내부적으로 사용되지만 다른 것들에서는 사용되지 않는다는 것을 몰랐습니다. – Tevatron

+0

+1'stdout = logfile'에 +1하십시오. 참고 : C++은 stdout이 tty가 아닌 경우 라인 버퍼링 대신 블록 버퍼링을 사용할 수 있습니다. 즉, 출력이 "실시간"이되지 않습니다 ([가능한 해결 방법에 대한 링크를 따르십시오] (http://stackoverflow.com)./a/17698359/4279)). 불필요하게'shell = True'를 사용하지 말고 list 인자 대신'[ "my_program", "arg 1", "arg 2"]'를 사용하십시오. 가독성을 위해 이진 모드 ("wb")로 파일을 엽니 다. – jfs

+0

@ J.F.Sebastian C++ 점에 감사드립니다. 참고로 Daniel Gallagher가 [이 대답] (http://stackoverflow.com/a/4752069/1863827)의 설명을 통해이 지점을 매우 명확하게 설명했습니다. stdout이 tty이면'\ n'은 출력 버퍼를 비우고 그렇지 않으면'std :: endl'은 항상 출력 버퍼를 비 웁니다. 'std :: endl'과'\ n'의 차이는 [이 답변] (http://stackoverflow.com/a/213977/1863827)에 잘 설명되어 있습니다. – Tevatron

관련 문제