プログラムAは、無限に入力を受け取り、処理してstdoutに出力するACプログラムです。
プログラムB(Python)を作成して、Aの出力を読み取り、必要なものをフィードバックします。これらの各プログラムのインスタンスは1つだけでなければならないことに注意してください。したがって、次の代わりにbのインスタンスであるb1とb2を指定します。
$ b1 | a | b2
私は持っている必要があります
$ b1 | a | b1
以下は、最終的に望ましい結果の図です。
クラスを使用してsubprocess.Popen
、プログラムAのサブプロセスを作成します。例:
import subprocess
import sys
# Create subprocess with pipes for stdin and stdout
progA = subprocess.Popen("a", stdin=subprocess.PIPE, stdout=subprocess.PIPE)
# Reassign the pipes to our stdin and stdout
sys.stdin = progA.stdout
sys.stdout = progA.stdin
これで、2つのプロセスはパイプを介して相互に通信できます。sys.stdin
また、元の変数と他の変数を保存してsys.stdout
、サブプロセスを終了することにした場合に、stdinとstdoutを元の状態(ターミナルなど)に復元できるようにすることもお勧めします。
グーグルでここに来る人のために:名前付きパイプを使用する非常に良い方法が実際にあります:
最初に2つの名前付きパイプを作成します。
mkfifo pipe1
mkfifo pipe2
次に、これを実行します。
echo -n x | cat - pipe1 > pipe2 & cat <pipe2 > pipe1
これにより、catコマンドは常に文字xを相互にコピーします。これで、catの代わりに独自のプログラムを使用して、入力と出力を自由に処理できるようになりました。これはPythonに限定されません。JavaプログラムをC++プログラムに接続することもできます。
たとえば、プログラムの名前がA.pyおよびB.pyの場合、最初のコマンドは次のようになります。
echo -n x | ./A.py - pipe1 > pipe2 & ./B.py <pipe2 > pipe1