2009-04-03 4 views
4

다른 입력 인수를 사용하여 명령 줄 프로그램을 실행하고 출력에서 ​​특정 줄을 가져 오는 스크립트를 작성했습니다. 나는 루프에서 실행되는 다음과 같은 한 :루프에서 subprocess.Popen (...) 호출의 출력을 인쇄하는 방법은 무엇입니까?

p1 = subprocess.Popen(["program", args], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=False) 
p2 = subprocess.Popen(["grep", phrase], stdin=p1.stdout, stdout=subprocess.PIPE, shell=False) 
p1.wait() 
p2.wait() 
p = str(p2.stdout.readlines()) 
print 'p is ', p 

하나의 문제는 루프가 실행 완료 한 후에 만 ​​출력이 있다는 것입니다. 나는 프로세스가 끝날 때마다 무언가를 프린트하고 싶다. 어떻게해야합니까?

또한 p1의 출력을 표시하는 옵션이 필요합니다. 하지만 p2를 깨지 않고 p1.stdout.readlines()를 사용하여 가져올 수는 없습니다. 어떻게해야합니까?

grep을 호출하지 않고 p1의 출력을 저장하고 구문을 검색 할 수는 있지만 출력이 너무 많아서이 방법이 매우 비효율적으로 보입니다.

의견을 보내 주시면 대단히 감사하겠습니다. 감사!

답변

2

다음은 리눅스에서 저에게 도움이되는 빠른 해킹입니다. 요구 사항에 따라 효과가있을 수 있습니다. program에 대한 내용으로 다음과 같이

#!/usr/bin/env python 

import subprocess 
import sys 

phrase = "bar" 
if len(sys.argv) > 1 and sys.argv[1] == 'print_all': 
    tee_args = ['tee', '/dev/tty'] 
else: 
    tee_args = ['tee'] 

p1 = subprocess.Popen(["./program"], stderr=subprocess.STDOUT, stdout=subprocess.PIPE, shell=False) 
p2 = subprocess.Popen(tee_args, stdin=p1.stdout, stdout=subprocess.PIPE, shell=False) 
p3 = subprocess.Popen(["grep", phrase], stdin=p2.stdout, stdout=subprocess.PIPE, shell=False) 
p1.wait() 
p2.wait() 
p3.wait() 
p = str(p3.stdout.readlines()) 
print 'p is ', p 

: 그것은 당신이 당신의 스크립트에 print_all를 전달하는 경우, (이봐, 나는 그것이 해킹했다) /dev/tty에 여분의 복사본을 중복 것, 필터로 tee를 사용

#!/bin/sh 

echo foo 
echo bar 
echo baz 

예 출력 : 내 주요 질문에 대한

 
$ ./foo13.py 
p is ['bar\n'] 
$ ./foo13.py print_all 
foo 
bar 
baz 
p is ['bar\n'] 
1

각 print 문 다음에 sys.stdout.flush()를 호출 해보십시오.

+0

작품. 감사! – Lin

관련 문제