web-dev-qa-db-ja.com

botocore.response.StreamingBodyをstdinPIPEとして使用する方法

大きなビデオファイルをAWSS3からPopenstdinにパイプしたいと思います。これは、Pythonの観点からは「ファイルのようなオブジェクト」です。このコードはAWSLambda関数として実行されるため、これらのファイルはメモリやローカルファイルシステムに収まりません。また、これらの巨大なファイルをどこにもコピーしたくはありません。入力をストリーミングし、その場で処理し、出力をストリーミングしたいだけです。私はすでに処理とストリーミングの出力ビットを機能させています。問題は、入力ストリームを_Popen pipe_として取得する方法です。

更新:コメントに基づいてStreamingBody.read(amt = chunk_size)を呼び出す ショートプログラム をまとめました。プログラムは入力ファイル(mp4ビデオ)の一部を読み取り、スタックします。おそらく、データのコンシューマー(ffmpeg)が実際に実行されていないか、STDINバッファーがいっぱいになり、混乱全体が停止しますか?

S3バケット内のファイルにアクセスできます。

_import boto3
s3 = boto3.resource('s3')
response = s3.Object(bucket_name=bucket, key=key).get()
body = response['Body']  
_

bodyは_botocore.response.StreamingBody_で、次のようになります。

{ u'Body': <botocore.response.StreamingBody object at 0x00000000042EDAC8>, u'AcceptRanges': 'bytes', u'ContentType': 'video/mp4', 'ResponseMetadata': { 'HTTPStatusCode': 200, 'HostId': 'aAUs3IdkXP6vPGwauv6/USEBUWfxxVeueNnQVAm4odTkPABKUx1EbZO/iLcrBWb+ZiyqmQln4XU=', 'RequestId': '6B306488F6DFEEE9' }, u'LastModified': datetime.datetime(2015, 3, 1, 1, 32, 58, tzinfo=tzutc()), u'ContentLength': 393476644, u'ETag': '"71079d637e9f14a152170efdf73df679"', u'Metadata': {'cb-modifiedtime': 'Sun, 01 Mar 2015 01:27:52 GMT'}}

私は次のようなbodyを使用するつもりです。

_from subprocess import Popen, PIPE
Popen(cmd, stdin=PIPE, stdout=PIPE).communicate(input=body)[0]
_

しかしもちろん、bodyはファイルのようなオブジェクトに変換する必要があります。問題はどのようにですか?

8
Mike Slinn

StreamingBodyからバイナリデータを読み取るには、StreamBody.read()を使用します。バイナリ文字列を取得します。

8
Michael