hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
12/18/2008 むう [長年日記]
tDiary 2247日目
■ [Py] subprocess.Popen
って,何も考えずにテキトーに使うとデッドロックするのか... ってもしかして使い方間違ってる?
from subprocess import Popen, PIPE p = Popen(['/bin/cat'], executable='/bin/cat', stdin=PIPE, stdout=PIPE) p.stdin.write('a' * (65536 * 2)) p.stdin.write('\n')
これで再現. もちろん os.write を使っても一緒.
strace とかかましてみれば分かるけど, python も cat もパイプへの書き込みでブロック. まあ当然と言えば当然なんだけど.
しかしこれを回避するために自前で select とか, 何か subprocess のうまみが半減してる気がするよなあ... ってまあそれしか思いつかん以上やるしかないのだけれど.
いけてねー.
うーん
subprocess - Subprocess management - Python v2.6.1 documentation
Warning: Use communicate() rather than stdin.write(), stdout.read() or stderr.read() to avoid deadlocks due to any of the other OS pipe buffers filling up and blocking the child process.
そう言われてもねえ.
子プロセスに渡したいデータが断続的に発生するものだったらどうすんのさ. それがバッファできるほど小さくないデータだったらどうすんのさ.