我想将AWS S3中的大型视频文件通过管道传输到Popen
的stdin
中,从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'}}
我打算使用
body
这样的东西:from subprocess import Popen, PIPE
Popen(cmd, stdin=PIPE, stdout=PIPE).communicate(input=body)[0]
但是当然
body
需要转换为类似文件的对象。问题是如何? 最佳答案
要从StreamingBody读取二进制数据,请使用StreamBody.read()
。您得到一个二进制字符串。
关于python - 如何将botocore.response.StreamingBody用作stdin PIPE,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34570226/