Python subprocess.Popen子プロセスのパイプ閉塞について詳しく説明します。
1779 ワード
問題発生の説明
サブプロセスを使用して大きなログファイルを処理し、ファイルを分析して照会するには、サブプロセスの出力結果を待って次の処理を行う必要があります。
問題のコードが出る
プロセスによっていくつかのデータが生成されます。彼らはブザーによって起きられます。ブザーがいっぱいになったら、プロセスの標準出力と標準エラー出力を書いてくれます。これらはパイプを通じて親プロセスに送られます。パイプラインが満杯になったら、サブプロセスは書き込みを停止します。そこで、詰まってしまいました。タイムリーにパイプの出力を取ったら、渋滞が発生しません。
しかし、私がここでとっているのは、一時ファイル受信サブルーチン出力です。一時ファイルはディスク上に構築されていますので、sizeの制限はありません。また、ファイルがcloseされると、対応するディスク上の空間も解放されます。
改良されたコード
サブプロセスを使用して大きなログファイルを処理し、ファイルを分析して照会するには、サブプロセスの出力結果を待って次の処理を行う必要があります。
問題のコードが出る
# 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子プロセスのパイプの詰まりについて詳しく解説したのは、小編集が皆さんに共有している内容の全部です。参考にしていただければと思います。どうぞよろしくお願いします。