2012-07-04 2 views
0

나는 파이썬 프로그래밍과 프로그래밍에 새로운 비결입니다. 이 소리가 기본적인 질문이라면 친절하게 변명하십시오.서브 프로세스 통신을 더 잘 만들어야합니다.

나는 코스에서 깨끗하게 만들고 git을 만드는 툴을 개발 중이다.

나는이 make 명령을 실행하기 위해 서브 프로세스 모듈을 사용하고 있습니다.

하나의 관찰은 다음과 같습니다. 의사 소통을 사용하여 make 명령의 결과를 봅니다. 통신 문제는 subprocess.popen이 끝날 때까지 대기 한 다음 출력을 보냅니다.

make 명령이 30 분 동안 실행되는 경우 30 분 동안 화면에 출력이 없으면 통신이 30 분 동안 수집 한 전체 데이터를 보냅니다.

질문 : stdout에 표시된 내용이있을 때와 같이 하위 프로세스의 출력을 가져 와서 화면에 출력하는 방법이 있습니까? 내가 지금까지 쓴

코드는 다음과 같습니다이에

def makeClean(path,cmd1='make',cmd2='clean'): 
    print '+++++++++++ RUNNING MAKE CLEAN +++++++++++ \n' 
    c = subprocess.Popen([cmd1 , cmd2],stdout = subprocess.PIPE, stderr = subprocess.PIPE,cwd = path) 
    out = c.communicate()[0] 
    for line in out.split('\r\n'): print line 

어떤 생각? 출력이 다시 호출 프로세스로 다시 리디렉션하지 않는, 표준 출력으로 이동해야하는 경우 ...

-Vijay

답변

2

을 나는() pexpect.run를 사용하여 시도하지만 나를 위해 작동하지 않았다. 단지

subprocess.call([cmd1, cmd2], cwd=path) 

이됩니다. 당신은 어떤 방법으로 출력을 처리해야하는 경우, 다음 communicate를 사용하지 않지만 직접 파이프에서 읽어

proc = subprocess.Popen([cmd1, cmd2], stdout=subprocess.PIPE, cwd=path) 
for ln in proc.stdout: 
    process(ln) 
+0

내 스크립트가 콘솔과 파일에 스크립트 로그를 인쇄합니다. subprocess.call을 사용하면 스크립트 로그가 파일에 들어 가지 못했습니다 .. 그러나 subprocess.Popen의 두 번째 솔루션은 나를 위해 일했습니다 .. 입력 해 주셔서 감사합니다. – user596922

+0

한 가지 더 빠른 질문 .. 두 번째 제안을 사용했지만 모든 행 끝에 새로운 행이 삽입되었습니다. 어떻게해야합니까? – user596922

+0

@ user596922 : 파이썬의 텍스트 입출력 메소드가 항상 그렇듯이, 원래의 입력에 있던 개행을 뉴 라인으로 삽입하지 * 않습니다 * * 유지합니다. 줄에서'strip' 메서드를 호출하여 제거 할 수 있습니다. –