2013-02-07 1 views
1

편집 : 죄송합니다! 실수로 내 질문과 일치하지 않는 코드를 게시했습니다. 실험을하기 전에이 글을 쓰기 시작 했으므로 테스트 과정에서 중간 지점의 코드를 게시했습니다. 코드를 약간 변경하여 게시하기로 한 것을 반영하기 위해이 질문을 수정했습니다.python이 perl을 호출하면 파일이 Popen에 의해 read()가 될 때까지 생성되지 않습니다

다음 Python 코드는 하나의 문제점으로 예상대로 작동합니다. unless I 자세한 경우 == False 인 경우 Perl 스크립트에서 생성 된 파일이 만들어지지 않습니다. 파일을 성공적으로 만들기 위해 기본 Perl 스크립트에 대해 output.stdout.read()를 호출해야하는 이유는 무엇입니까? 내가 프로덕션 환경에서 거짓 = 자세한 내 파이썬 스크립트를 실행하려고 할 때까지 나는 심지어 아무것도 몰랐어요

cmdStringList = ["perl","script.pl","arg1",...] 

output = subprocess.Popen(cmdStringList,stdout=subprocess.PIPE) 

if verbose: 
    print output.stdout.read() 

잘못이었다. Popen과 하위 프로세스의 동작을 이해하려고 시도하기 위해 google-fu를 수행했지만이 동작에 대한 이유가 없었습니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

귀하의 질문에 일관성이 없습니다. 당신은'output.stdout.read()'를 호출하지 않으면 실패하고, verbose가 false로 설정되면 실패하기 시작했다고합니다. 어떤거야? 잘못된 코드를 게시 했습니까? – ikegami

+0

네가 맞아 - 내 질문에 엉망이 됐어. 처음에 게시 할 의도가있는 코드로 변경했습니다. – Anthony

답변

1

실제로 다음 코드가 있습니다. 맞습니까?

if verbose: 
    outputRead = output.stdout.read() 
    print outputRead 

문제는 자식이 STDOUT (으)로 쓰기를 시도하는 것이 차단된다는 것입니다. 파이프에서 읽음으로써 파이프에 약간의 공간이 생길 때까지, 자식은 STDOUT에 쓰기를 끝내고 참조 할 파일을 생성하는 곳으로 이동할 수 없습니다.

자녀가 읽지 않고 막지 않도록하려면 표준 출력을 nul (Windows) 또는 /dev/null (다른 곳)으로 리디렉션하십시오. 이 모든 곳에서 작동하지만 윈도우해야합니다

cmdStringList = ["sh","-c","\"$0\"" \"[email protected]\" >/dev/null","perl","script.pl","arg1",...] 

(.. 죄송 구문 오류가 난 전혀 파이썬을 모르는)

+0

네, 맞습니다. 내 초기 코드는 실수로 잘못 되었기 때문에 타이밍 오류가 있습니다. 그래도 내가 게시하려는 코드에서 변수를 통해 전송하지 않았습니다. 나는 직접 output.stdout.read()를 출력했다. 이제는 내 질문에 나와있다. – Anthony

+0

@Anthony, 업데이트보기. – ikegami

+0

이것은 생각합니다. 그래도 문제인지 확인하는 방법을 모르겠습니다. – Anthony

1
당신은 스트림을 읽는 유지해야

, 그렇지 않으면 버퍼는, 전체 될 수 있습니다 당신의 perl 프로세스가 차단 될 수 있습니다. 특정 언어와 관련이 없지만 과소 운영 체제는 아닙니다.

Java를 사용하면 a similar problem가 발생했습니다.

+0

프로그램 실행을 차단하고 싶지 않으면 어떻게 계속 파이프를 읽습니까? mutliprocessing 모듈을 사용해야합니까? – Anthony

+0

그것은 낭비 일 것입니다. 앞서 언급 한 것처럼 출력을 nul 또는/dev/null로 리다이렉트하면됩니다. – ikegami