2

私が変更できないプログラムは、その出力を引数として提供されたファイルに書き込みます。不要なディスク IO を実行する必要がないように、出力を RAM に送りたいと考えています。tmpfs を使用してプログラムを「トリック」してそれに書き込むことができると思いましたが、すべての Linux ディストリビューションが /tmp に tmpfs を使用するわけではなく、/run (Ubuntu) の下に tmpfs をマウントするものもあれば、/dev/shm (RedHat) の下にマウントするものもあります。私は自分のプログラムを可能な限り移植可能にしたいと考えており、できればユーザーのシステムに tmpfs ファイル システムを作成したくありません。明らかに、私は df | を実行できます。tmpfs を grep し、返されたマウントを使用しますが、もう少しエレガントなものを望んでいました。疑似端末または /proc のどこかに書き込むことは可能ですか?

4

3 に答える 3

2

子プロセスがシークできないファイルを受け入れる場合は、名前付きパイプを試すことができます。名前付きパイプの内容はディスクに触れません。

于 2014-09-03T23:38:02.023 に答える
1

Python スクリプトを、他のプログラムを繰り返し呼び出す部分と結果をマージする部分の 2 つの部分に分割し、前者を Bash スクリプトに変換して、>()プロセス置換構造を使用して疑似ファイルを他のプログラムに渡すことができます。それは実際には別のプロセスの標準入力です。

概念実証:

これが他のプログラムであると仮定します。

$ cat otherprogram.py 
#/usr/bin/env python
import sys

with open(sys.argv[1], 'w') as file:
          file.write('Hello\n')

引数にファイル名を取り、「Hello」を書き込みます。5 回呼び出す必要があるとします。次に、次のようなことができます。

for i in {1..5}; do python otherprogram.py >(cat) ; done

otherprogram.pyこれは、ファイルに書き込んでいると思われるものを stdout に出力します。次に、次のように、Python スクリプトの他の部分でそれを使用できます。

$ cat consume.py 
#!/bin/env python

import fileinput

for line in fileinput.input():
        print "Processing line ", line

(これは単に「Hello」の前に何かを追加するだけです)

$ { for i in {1..5}; do python otherprogram.py >(cat) ; done } | python consume.py
Processing line  Hello

Processing line  Hello

Processing line  Hello

Processing line  Hello

Processing line  Hello

つまりotherprogram.py、ファイルに書き込んでいると思われるのは、実際には、Bash のプロセス置換メカニズムのおかげで、ディスクにヒットすることなくプログラムの stdin に送信されているということです。

于 2014-09-03T22:24:17.427 に答える