4

プログラムAは、無限に入力を受け取り、処理してstdoutに出力するACプログラムです。

プログラムB(Python)を作成して、Aの出力を読み取り、必要なものをフィードバックします。これらの各プログラムのインスタンスは1つだけでなければならないことに注意してください。したがって、次の代わりにbのインスタンスであるb1とb2を指定します。

$ b1 | a | b2

私は持っている必要があります

$ b1 | a | b1 

以下は、最終的に望ましい結果の図です。

代替テキスト

4

2 に答える 2

7

クラスを使用して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を元の状態(ターミナルなど)に復元できるようにすることもお勧めします。

于 2010-12-09T04:17:44.677 に答える
1

グーグルでここに来る人のために:名前付きパイプを使用する非常に良い方法が実際にあります:

最初に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
于 2013-01-22T04:46:52.010 に答える