当前位置:  开发笔记 > 编程语言 > 正文

如何使用botocore.response.StreamingBody作为stdin PIPE

如何解决《如何使用botocore.response.StreamingBody作为stdinPIPE》经验,为你挑选了1个好方法。

我想将来自AWS S3的大型视频文件传输到Popen's stdin,这是从Python的角度来看的'文件类对象'.此代码作为AWS Lambda函数运行,因此这些文件不适合内存或本地文件系统.此外,我不想在任何地方复制这些巨大的文件,我只想流式传输输入,动态处理和流输出.我已经有处理和流输出位工作了.问题是如何获得输入流作为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']  

bodybotocore.response.StreamingBody这样的:

{ u'Body': , 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需要转换为类似文件的对象.问题是如何?



1> 小智..:

用于从StreamingBody中读取二进制数据StreamBody.read().你得到一个二进制字符串.


调用read()将整个视频(数百MB)加载到RAM中.我需要一次吸入一个块来流动它
推荐阅读
有风吹过best
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有