パイプからのデータは 1 回だけ読み取ることができます。ただし、データを単純にコピーして 2 つの異なるファイル記述子に書き込む中間プロセスを使用することはできます。Unix システムでは、これは標準ツールによって行われますtee
。POSIX シェルでの例:
$ exec 4> a
$ seq 3 | tee /dev/fd/4 > b
これにより、とのseq 3
両方のファイルにの出力が書き込まれます。a
b
Python で同じことを行うには、1つの呼び出しとプロセスのos.pipe()
へのsubprocess.Popen()
呼び出しを組み合わせて使用し、接続するプロセスごとに をtee
1 つ呼び出します。subprocess.Popen()
producer = subprocess.Popen(["seq", "3"], stdout=subprocess.PIPE)
pipe_r, pipe_w = os.pipe()
tee = subprocess.Popen(["tee", "/dev/fd/{}".format(pipe_w)],
stdin=producer.stdout, stdout=subprocess.PIPE)
consumer1 = subprocess.Popen(["cat"], stdin=tee.stdout)
consumer2 = subprocess.Popen(["cat"], stdin=pipe_r)
producer.wait()
tee.wait()
consumer1.wait()
consumer2.wait()
os.close(pipe_r)
os.close(pipe_w)