如何将botocore.response.StreamingBody用作stdin PIPE

时间:2016-01-02 20:10:47

标签: python python-2.7 stdin boto3

我想将来自AWS S3的大型视频文件传输到Popen的{​​{1}},这是从Python的角度来看的一个类似文件的对象和&#39} #39 ;.此代码作为AWS Lambda函数运行,因此这些文件不适合内存或本地文件系统。此外,我不想在任何地方复制这些巨大的文件,我只想流式传输输入,动态处理和流输出。我已经得到了处理和流输出位。问题是如何获得输入流为stdin

更新:我整理了一个基于评论调用StreamingBody.read(amt = chunk_size)的short program。该程序读取一些输入文件(一个mp4视频)并被卡住,可能是因为数据的消费者(ffmpeg)实际上没有运行,或者它的STDIN缓冲区填满并且整个混乱都停止了?

我可以访问S3存储桶中的文件:

Popen pipe

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] 需要转换为类似文件的对象。问题是如何?

1 个答案:

答案 0 :(得分:8)

要从StreamingBody读取二进制数据,请使用StreamBody.read()。你得到一个二进制字符串。