cat
簡単にするために、シェル スクリプトがコマンドであると仮定します。シェルでは、通常、次のように呼び出されます。
$ cat /some/path/myfile.txt
ファイルは動的に作成され、ディスクに書き込むと、パフォーマンスが大幅に低下し、セキュリティの問題が発生し、マルチユーザー環境でのファイル管理のオーバーヘッドが増加します。スクリプトを変更することも、stdin から読み取ることもできません (これcat
は単なる作業サンプルでした)。
私はこれを試しました:
import os
pin, pout = os.pipe()
pin, pout = os.fdopen(pin, 'r'), os.fdopen(pout,'w')
from subprocess import Popen
pout.write("test")
pout.flush()
p = Popen('cat /proc/self/fd/%s' % pout.fileno(), shell=True)
閉じpout
p.poll()
ても、コマンドがまだパイプからの入力を待っていることを示す何も返されません。
パイプからデータが来ていないことをコマンドに伝えるにはどうすればよいですか? これを解決する他のアプローチはありますか?
編集
bash では、ファイルの内容が次の名前のプログラムによって生成された場合、次のprog1
ように解決されます。
$ cat <(prog1)
編集 2
シェルが必要ない場合は、Alfe が言及した他のオプションの方が適切ですが、問題はまだ存在します (つまり、ファイルの内容を読み取った後にプロセスが終了していません)。
#...same as before
p = Popen(['cat', '/dev/stdin'], stdin=pout)