如何使用botocore.response.StreamingBody作为stdin管道

2024-09-27 07:24:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把AWS S3中的大型视频文件导入Popenstdin,从Python的角度来看,这是一个“类文件对象”。此代码作为AWS Lambda函数运行,因此这些文件将无法装入内存或本地文件系统。另外,我不想把这些巨大的文件复制到任何地方,我只想流化输入、动态处理和流化输出。我已经让处理和流输出位开始工作了。问题是如何获得作为Popen pipe的输入流。

更新:我把一个short program放在一起,它基于一个注释调用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'}}

我打算用这样的方法:

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

但当然body需要转换成类似文件的对象。问题是怎么做?


Tags: 文件对象importawss3bucketresponsestdin

热门问题