2013-04-10 2 views
5

나는 실행 파일을 호출하는 python 스크립트를 가지고있다. 실행 파일의 출력은 호출 된 시간에 대한 정보와 함께 로그 파일로 리디렉션됩니다. 예를 들어, 실행으로 python -V를 사용하여이 설명하기 :파일에 대한 서브 프로세스 stdout가 순서가 맞지 않는 이유는 무엇입니까?

import time, subprocess 
with open('./LOGFILE.txt', 'a') as F: 
    F.write('******\n') 
    F.write('Events on %s :\n'%time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())) 
    EXE_output = subprocess.call(['python', '-V'], stdout=F, stderr=F) 

파일 LOGFILE.txt의 출력은 다음과 같이 내가 기다리고 있었다

Python 2.7.3 
****** 
Events on 2013-04-10 19:27:25 : 

:

****** 
Events on 2013-04-10 19:27:25 : 
Python 2.7.3 

내가 쓴 서브 프로세스를 실행하고 출력 및 오류를 파일로 재지 정하기 전에 열린 로그 파일의 ****** 및 시간 정보. 왜 그런 주문입니까? 어떻게 재정렬 할 수 있습니까?

+0

하위 프로세스를 실행하기 전에 F.flush()를 시도하십시오. – gcbirzan

+0

일했습니다! 약간의 설명과 함께 답으로 게시 할 수 있습니까? – amyassin

답변

6

하위 프로세스를 실행하기 전에 F.flush()를 호출해야합니다. 그 이유는 서브 프로세스가 완료되면 버퍼를 플러시하는 반면, 그렇지 않으면 버퍼를 플러시합니다.

+0

그래서 나는 올바른 순서로 글을 쓰고 있었지만, 실제로 서브 프로세스 프로세스가 그 데이터를 디스크에 저장하고 있었습니까? – amyassin

+1

기술적으로 아니오, 데이터가 프로세스 특정 사용자 공간 버퍼 밖으로 플러시되었습니다. 커널은 그렇지 않습니다. 프로세스가 끝나면 버퍼를 플러시합니다. 따라서 데이터가 동일한 순서로 디스크에 도착하게하려면 원하는 순서대로 플러시해야합니다. – gcbirzan

+3

프로세스에서 운영 체제로 데이터를 이동하는 것은 비용이 많이 드는 작업이므로 C 라이브러리는 프로세스에서 데이터를 버퍼링하고 쓰기 작업 빈도를 줄입니다. 하위 프로세스가 종료되면 clib은 데이터를 운영 체제로 플러시했지만 상위 프로세스는 여전히 데이터를 로컬에 보관합니다. 운영 체제의 관점에서 보면 하위 프로세스가 먼저 씁니다. – tdelaney

관련 문제