【问题标题】:How to use botocore.response.StreamingBody as stdin PIPE如何使用 botocore.response.StreamingBody 作为标准输入管道
【发布时间】:2016-04-06 19:56:00
【问题描述】:

我想将大型视频文件从 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'}}

我打算像这样使用body

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

当然body 需要转换成文件类对象。问题是如何?

【问题讨论】:

  • 在这个相关的thread中查看我的回复。
  • 查看我对相关thread的回复。

标签: python python-2.7 stdin boto3


【解决方案1】:

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

【讨论】:

  • 调用 read() 将整个视频(数百 MB)加载到 RAM 中。我需要一次吸入一大块来流式传输它
  • @MikeSlinn StreamingBody.read(amt=chunk_size) 让您处理 chunk_size 字节
  • 我整理了一个short program,它从另一个线程调用StreamingBody.read(amt=chunk_size)。它读取输入文件(mp4 视频)的 1/3 并卡住,可能是因为在原始线程上运行的数据消费者(ffmpeg)实际上并未运行。也许它的 STDIN 缓冲区已满,整个混乱局面停止了?
  • 当 StreamingBody 只包含一个 JSON 文档时,例如 IoT 中的设备影子,我们如何知道它是用什么编码的?我已经看到很多假设它将是 UTF-8,但我没有看到这实际上记录在案。
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多