Posted at

Python3でサブプロセスを起動してサーバ的に使う

More than 1 year has passed since last update.

Pythonではsubprocessモジュールを使うとサブプロセスを起動できます。そのサブプロセスにデータを入力し、処理結果をもらいたい場合があります。それもサブプロセスを終わらせず、サーバー的に使いたい。


client.py

#!/usr/bin/env python3

from subprocess import Popen, PIPE
import sys

p = Popen(['cat'], bufsize=0, stdin = PIPE, stdout = PIPE)
while True:
s = sys.stdin.readline()
p.stdin.write(s.encode('utf-8'))
output = p.stdout.readline()
print(output.decode('utf-8'), end='')


Popenの引数のbufsitze=0がキモです。また、起動されるサブプロセス(この場合はcat)の出力はバッッファリングしない(出力ごとにflushする)必要があります。ソースがなくて改造できないコマンドでも、出力をバッファリングしないオプションがある場合がありますので、確かめてください。