標準入力に1行入れると、標準出力で1行返してくるようなプログラムがあって、起動のたびに7分かかってめんどうだから、プロセスを起動しっぱなしにしておいてHTTPサーバで包んでやろうと思ったんですよ。 サブプロセスの挙動としてはcatだと思っていい。それで p = Popen(["cat"], stdin=PIPE, stdout=PIPE) ってやってから p.stdin.write("%s\n" % query) result = p.stdout.read() ってやるとブロックされてしまった。ブロックを避けるために生のread/writeではなくp.communicateを使えとマニュアルには書いてあるが、それを使うと1回やり取りした時点でfdを閉じてしまうから2回目で「ValueError: I/O operation on closed file」になる。p.stdin.flush