このPythonスクリプトを使用すると、デッドロックの問題が発生します。このPythonスクリプトは、2つのプログラムをパイプして生成された出力を解析し、結果をディレクトリxに保存します。
import subprocess as sp
from time import sleep
p1 = sp.Popen(['executable_1'], stdout=sp.PIPE , stderr = sp.STDOUT)
p2 = sp.Popen(['executable_2'], stdin=p1.stdout, stdout = sp.PIPE)
x = my_parser(p2.stdout)
ただし、すべてを使用してスクリプトを変更すると、p2 = sp.Popen(executable_2, stdin=p1.stdout, stdout = sp.PIPE, preexec_fn = time.sleep(0.1))
正常に動作しているようです。
しかし、解決策は私にはあまりきれいではないようです。少し待ってから、p1 にその出力を stdout にフラッシュする可能性を与えることを理解しています (ただし、手動で試行するp1.stdout.flush()
と、IOError が発生することもあります)。
executable_2
p2 の出力が非常に大きく、まだ実行中にデータを処理したいので、communicate() を使用できません。
この場合、sleep() を使用せずにデッドロックを防ぐにはどうすればよいですか?