2013-03-12 3 views
0
나는 아주 큰 파일에서 라인을 읽고 아래 subprocesss을 사용하고

(arnd 4기가바이트)Subprocess.Popen stdout을 반복하는 루프를 끊는 방법?

gawk_exp filename.gz cmd를 =하려면 zgrep "검색 텍스트"또 다른 둔한는

p1=subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE) 
p=subprocess.Popen(gawk_exp, shell=True, stdin=p1.stdout, stdout=subprocess.PIPE) 

입니다 greop 된 줄에서 필터링 할 표현식.

아래와 같이 다음에 반복 P :

for line in iter(p.stdout.readline, ''): 
    .. 
    .. 
    .. 
    if(success): 
     break 

이 결과 "그렙 : 기록 출력 : 깨진 파이프"오류.

그러나 특정 조건을 충족하는 경우 for 루프에서 일찍 종료하고 싶습니다.

내가 같은 많은 도로를 시도했습니다

, 다른 순서로

if(success): 
    os.kill(p.pid, signal.SIGKILL) 
    os.kill(p1.pid, signal.SIGKILL) 
    OR 
    subprocess.Popen.kill(p1.pid, p.pid) 
    subprocess.Popen.kill(p.pid) 
    OR 
    p1.stdout.close() 
    p.stdout.close() 

하지만 아무 소용.

어떻게 정상적으로 루프에서 깨질 수 있습니까?

버전 정보 : 파이썬 2.4.3 (# 1 이세 (11) 2009 년 14시 9분 37초) [GCC 4.1.2 20080704 (레드햇 4.1.2-44)]에서 동시에

답변

0

당신 zgrep 작업에 대해 stderr을 설정하고 캡처 한 다음 다른 곳에서 오류를 발견 한 경우에만 해당 작업을 인쇄하십시오 (예 : 루프의 초기 종료로 설정하지 않은 경우).

또는 zgrep을 실행하고 파이썬에서 zlib 바로 사용을 시작 Popen 사용을 중지 : http://docs.python.org/2/library/zlib.html - 개인적으로 나는 아마도 파이썬에서 모든 것을 구현하는 대신 gawk를 사용하여 다음이 시도를 줘야 할 것.

0

여기에 직접 질문에 답변하지는 않지만, 이러한 종류의 작업에 대해서는 plumbum이 매우 유용하다는 것을 지적하고 싶습니다. popen 등 대신 사용하면 삶이 훨씬 쉬워집니다.

+0

감사합니다. 불행히도 필자는 2.4.3을 사용할 의무가 없으므로 사용할 수 없다. – Aymer

관련 문제