Python subprocess.Popen 하위 프로 세 스 파이프 차단 에 대한 자세 한 설명

1904 단어 PythonsubprocessPopen
문제 발생 설명
하위 프로 세 스 를 사용 하여 큰 로그 파일 을 처리 하고 파일 을 분석 하고 조회 합 니 다.하위 프로 세 스 가 실행 할 출력 결 과 를 기다 리 고 다음 처 리 를 해 야 합 니 다.
문제 코드

#          shell  
def __subprocess(self,cmd):
 try:
 #     shell  ,         
 p = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) 
 p.wait()

 #        shell       
 #rt = p.stdout.read().decode()

 #         ,           
 rt_list = rt.strip().split('
') except Exception as e: if(DEBUG): print(traceback.format_exc()) return rt_list
문제 분석
하위 프로 세 스 는 일부 데 이 터 를 생 성 합 니 다.버퍼 가 가득 차 면 하위 프로 세 스 의 표준 출력 과 표준 오류 출력 을 기록 합 니 다.이 물건 들 은 파 이 프 를 통 해 부모 프로 세 스에 보 냅 니 다.파이프 가 가득 찬 후에 하위 프로 세 스 는 기록 을 멈 추 었 습 니 다.그래서 멈 추 었 습 니 다.파이프 의 출력 을 제때에 가 져 가면 막 히 지 않 습 니 다.
그러나 저 는 임시 파일 을 사용 하여 하위 프로 세 스 출력 을 받 습 니 다.임시 파일 은 디스크 에 세 워 져 있 기 때문에 size 의 제한 이 없고 파일 이 close 되면 해당 디스크 의 공간 도 방출 됩 니 다.
개 선 된 코드

import tempfile
#          shell  
def __subprocess(self,cmd):
 try:
 #           ,   close ,        
 out_temp = tempfile.TemporaryFile(mode='w+')
 #           
 fileno = out_temp.fileno()

 #     shell  ,            
 p = subprocess.Popen(cmd, shell=True, stdout=fileno, stderr=fileno) 
 p.wait()

 #        shell       
 out_temp.seek(0)
 rt = out_temp.read()

 #         ,           
 rt_list = rt.strip().split('
') except Exception as e: if(DEBUG): print(traceback.format_exc()) finally: if out_temp: out_temp.close() return rt_list
이 편 은 Python subprocess.popen 서브 프로 세 스 파이프 차단 에 대한 상세 한 설명 은 바로 편집장 이 여러분 에 게 공유 한 모든 내용 입 니 다.참고 하 시기 바 랍 니 다.여러분 들 도 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기