2014-10-13 4 views
0

서브 프로세스를 사용하여 실행 파일을 실행하고 통신을 사용하여 서브 프로세스를 출력합니다. 마지막으로, 통신 내용을 파일에 씁니다. 정확한 코드는 아래에 표시됩니다.통신을 사용하여 서브 프로세스의 stdout을 파일로 작성

run = subprocess.Popen(['executable'], stdout=subprocess.PIPE) 
output = run.communicate()[0] 
logfile = open('run.log', 'a') 
logfile.write(output) 
logfile.close() 

위의 과정에서 로그 파일은 실행이 끝날 때 작성됩니다. 그러나 실행 파일이 실행 중일 때 출력을 로그에 기록하는 방법이 있습니까?

logfile = ('run.log', 'w') 
run = subprocess.Popen(['executable'], stdout = logfile) 
run.wait() 
logfile.close() 

첫 번째 줄이 만들어 쓰기에 대한 run.logstdout은 실행 파일과 로그 파일에 직접 기록 : 나는이에 대한 해결책을 찾은 것 같아요

with open("run.log","a") as f: 
     run = subprocess.Popen(['executable'], stdout=f) 
+0

이 내용은 [docs] (https://docs.python.org/3/library/subprocess.html#frequently-used-arguments)에서 직접 설명합니다. "* stdin *, * stdout * 및 * stderr * 유효한 값은'PIPE','DEVNULL', 기존의 파일 기술자 (양의 정수), 기존의 파일 객체,'None'입니다. 실행 된 프로그램의 표준 입력, 표준 출력, 표준 오류 파일 핸들을 지정합니다. – abarnert

답변

2

당신은 무언가 같이 의미 실행 중입니다. run.wait()은 실행 파일이 완료 될 때까지 대기 한 다음 로그 파일을 닫습니다.

+0

자식 프로세스가 끝날 때까지 기다리는'subprocess.check_call()'을 사용한다. 서브 프로세스가 0이 아닌 종료 상태를 리턴하면'check_call()'도 자동으로 예외를 발생시킵니다. 감사합니다. @ padraic. – jfs

+0

위의 동작을하는 동안 터미널은 실행 파일에서 자유롭게됩니다. 'subprocess'가 실행이 끝날 때까지 터미널에서 실행 파일을 유지할 수있는 방법이 있습니까? – hypersonics

+0

@Deepak : 제가 제안한 것처럼'Popen'을'check_call'으로 대체하십시오. 매개 변수는 동일합니다. – jfs