2012-04-19 2 views
2

jsmin.c를 다운로드하여 컴파일하고 터미널에서 javascript 파일로 실행하면 훌륭하게 작동합니다. 하지만 os.system()이나 os.popen()을 파이썬 스크립트 (동일한 입력 파일)에서 호출하면 출력 파일 (js 파일의 축소판)이 잘리는 것처럼 보입니다. stdout은 하위 프로세스가 종료되기 전에 플러시되지 않거나 jsmin이 일찍 종료되는 것처럼 보입니다. 디스크 버퍼링 등으로 계속 진행되고있는 것처럼 보입니다.jsmin이 파이썬 하위 프로세스에서 실행될 때 일찍 종료하는 이유는 무엇입니까?

하지만 그 중 어떤 것도 사실이 아닙니다. 종료 값은 출력이 잘리는 경우에도 main()에서 반환 한 값이며, fflush (stdout)에 대한 호출을 추가해도 아무런 차이가 없으며 jsmin을 호출 한 후 동일한 하위 셸에서 sync를 호출해도 어떤 차이.

fputc()에 대한 호출로 putc() 호출을 바꾸려고 시도했는데 처음에는 문제가 해결되지 않은 것처럼 보였습니다. 그러나 그럴 수 없게 문제가 다시 발생하기 시작했습니다. 안정적으로 발생합니다. Bizare?

나는 jsmin.c에 문제가 있다고 말하고 싶지만 명령 행에서 같은 입력 파일을 실행할 때 프로그램이 잘 동작하므로 python 하위 프로세스에서 실행하는 것과 관련이있다.

가 여기 내 서브 프로세스 호출입니다 :

result = os.system('jsmin < ' + tpathname + ' > ' + tpathname + '.min') 

(나는 경로에 JSMin을 넣어 가지고, 그것을 실행, 나는 ℃와 pH 5.5 또는 다른 pH 파일의 예상 결과의 대부분을 얻을.)

사람이 수 이 문제의 원인을 상상해보십시오.

+0

당신이 쉘에서 직접에서 실행할 때'에서 JSMin jsfile.min' 명령이 제대로 작동 건가요? 왜냐하면'os.system()'가 쉘을 포크하여 _jsmin_의 실행 환경이 두 경우 모두 거의 동일해야하기 때문에 이상합니다. – C2H5OH

+0

그래, 그게 내가 말하는거야. 나는 심지어 새틴 춤으로 시작하는 jsmin을 실행하는 쉘 스크립트를 만들려고 시도했다. 이 셸 스크립트는 터미널에서 작동하지만 파이썬에서는 발생하지 않습니다. WTF? – Shavais

+0

쉘 스크립트에서 env를 써서 파이썬 서브 프로세스에서 실행하고 셸에서 실행하는 것과 다른 env 차이점을 감지 할 수 있는지 알아 보았습니다. 유일한 차이점은 3 대신 SHLVL = 4이고 PWD가 다릅니다. 그게 다야, 그 외 모든 것은 정확히 동일합니다. – Shavais

답변

0

스택 오버플로는 5 시간 동안이나 내 자신의 질문에 답할 수 없으므로이 '답변'은 원래 편집본에 추가되었습니다. (또한 채팅 할 수 없기 때문에 약간의 댓글이 늘어났습니다.)

문제점을 발견했습니다. 문제는 jsmin에 대한 입력 파일을 만든 다음 jsmin을 호출하는 python 프로그램에서 발생했습니다. 그것은 (아직) 파일을 닫지 못하고 그 파일에 jsmin을 호출하는 데 실패했습니다. 그래서 jsmin은 일찍 종료되지 않았고 출력이 잘리는 것도 아니 었습니다. 오히려 불완전한 입력 파일에서 작동하고있었습니다. (Duh.)

파이썬 프로그램이 결국 jsmin의 입력 파일을 닫는 것을 제외하고는 훨씬 더 일찍 깨달았을 것입니다. jsmin이 처리 할 때까지는 완료되지 않았을뿐입니다.

이 매우 일이 '와'관용구에 대한 동기 중 하나입니다

with open(targetpath, 'w+') as targetfile: 
    ..code that writes to targetfile 
관련 문제