1

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)
4

3 に答える 3

1

これは私が最後にしたことですが、良くありません。

私はCentOSと私が抱えている問題に取り組んでいるため(ここで質問しました:Python Popen can't open bash shell in CentOS/Red Hat)使用できませんexecute='/bin/bash'。そのため、ソリューションが少し異なって見えます質問より。

bashプロセスの置換とヒ​​アドキュメントを使用して、いくつかの構成でプロセスに渡しているもの:

file_contents = '...'
p = Popen(['/bin/bash', '-c', "cat <(cat<<'EOF_CFG'\n%s\nEOF_CFG\n)" % file_contents])

名前付きパイプを作成するために tmpfs を使用することを検討しています。最初にスクリプトを開始してからパイプに書き込むとうまくいくと思います...成功した場合は、ここにも書き込みます。

于 2012-11-23T13:01:14.637 に答える
0

これには名前付きパイプを使用してみてください。その上で、EOF が適切に伝播されます。

$ mkfifo bla
$ python
from subprocess import Popen
p = Popen('cat bla', shell=True)
with file('bla', 'w') as f:
  f.write('test')

もちろん、Python からその場で名前付きパイプを作成することもできますos.mkfifo()

于 2012-11-23T13:32:50.777 に答える
0

少しいじってみると、一方のパイプを閉じても、子プロセスの関連する疑似ファイル /proc/self/fd/<#> で eof が生成されないようです。/dev/stdin で試して、入力をサブプロセスの stdin に単純にパイプしましたか?

于 2012-11-22T15:56:55.460 に答える