Python subprocess.Popen子プロセスのパイプ閉塞について詳しく説明します。


問題発生の説明
サブプロセスを使用して大きなログファイルを処理し、ファイルを分析して照会するには、サブプロセスの出力結果を待って次の処理を行う必要があります。
問題のコードが出る

#          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子プロセスのパイプの詰まりについて詳しく解説したのは、小編集が皆さんに共有している内容の全部です。参考にしていただければと思います。どうぞよろしくお願いします。