2017-11-30 3 views
0

forループの各インスタンスは、後で処理するために別のスクリプトで取り込む必要があるバイナリファイルの内容を吐き出します。たとえば、次のようにpython forループの1回の繰り返しによるパイプ出力

script1.py

filename = glob.glob('*.txt') 
for i in range(len(filename)): 
    with open(filename[i], 'rb') as g: 
     sys.stdout.write(g.read()) 

script2.py

from subprocess import call 
script = "cat > test.fil" 
call(script,shell=True) 

コマンド:私は、このコマンドを実行すると

python script1.py | python script2.py 

、それが完了するすべての反復を待ち出力をscript2.pyにパイプする前に。私はこれをバッチ式にしたいと思います。たとえば、あるバイナリファイルのデータがstdoutにプッシュされたら、script2.pyを起動します。

script2.pyはscript1.pyから呼び出せません。両方のスクリプトは異なるドッカーコンテナで実行する必要があります。ドッカーコンテナ内にドッカーを設置することを避ける方がよいでしょう。

+0

を理由だけではなく、2番目のスクリプトで直接 'stdin'を読んではなく、それを行うには、シェルを使用しようとしていませんか? (あなたは 'stdin'に接続していませんが、シェルでそれを行うことができますが、私はそれを最も無駄な猫の使い方と呼んでいます(http://porkmail.org/era/unix/award .html)これまでに見たことがあります。 – kindall

+1

'script2.py'は、' script1.py'がそれらをどのように書き込むかにかかわらず、同じ連続したバイトストリームを見ています。 'script1.py'の出力にいくつかの追加バイトを挿入したり解析したりすることなく、異なるファイルからバイトを確実に区別することはできません。 – chepner

+0

@chepner、何がうまくいくかの例を教えていただけますか? – Vishnu

答えて

1

sys.stdoutがパイプに接続されている場合、デフォルトではバッファリングされます。あなたは、出力をフラッシュするsys.stdout.flush()を呼び出す必要があります:

sys.stdout.write(g.read()) 
sys.stdout.flush() 

あなたの2番目のスクリプトも、それを読むために、猫を喚起するために、代わりにシェルを想起させるの、標準入力を直接読むことができました。あなたが書いたように、あなたは3つのプロセス(python、シェル、cat)を実行しています。無関係なノートで

import shutil 
import sys 
with open('test.fil', 'w') as f: 
    shutil.copyfileobj(sys.stdin, f) 

、あなたは唯一のインデックスにlistを番号を使用しようとしているとき、数値rangeforループを使用する必要はありませんforループがlist要素に直接反復処理することができます

filenames = glob.glob('*.txt') 
for filename in filenames: 
    with open(filename, 'rb') as g: 
     ... 
+1

'flush'が行うのは、ファイルがパイプバッファより小さければ強制出力だけです。第2のスクリプトが特定のファイルからのバイトを識別するのを助けることはありません。 – chepner

+0

@noskloあなたは正しいですが、私はcatを使う必要はありませんが、script2がchepnerのように異なるファイルを確実に区別するための方法があります。 – Vishnu

関連する問題