Como usar botocore.response.StreamingBody como stdin PIPE

Quero canalizar grandes arquivos de vídeo do AWS S3 paraPopenéstdin, que é do ponto de vista do Python um 'objeto semelhante a arquivo'. Esse código é executado como uma função do AWS Lambda; portanto, esses arquivos não cabem na memória ou no sistema de arquivos local. Além disso, não quero copiar esses arquivos enormes em nenhum lugar, apenas transmitir a entrada, processar em tempo real e transmitir a saída. Eu já tenho os bits de saída de processamento e streaming funcionando. O problema é como obter um fluxo de entrada como umPopen pipe.

Atualização: montei umprograma curto que chama StreamingBody.read (amt = chunk_size) com base em um comentário. O programa lê parte do arquivo de entrada (um vídeo em mp4) e fica preso, possivelmente porque o consumidor dos dados (ffmpeg) na verdade não é executado, ou talvez seu buffer STDIN seja preenchido e toda a bagunça seja interrompida?

Eu posso acessar um arquivo em um bucket S3:

import boto3
s3 = boto3.resource('s3')
response = s3.Object(bucket_name=bucket, key=key).get()
body = response['Body']  

body é umbotocore.response.StreamingBody que fica assim:

{ 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'}}

Pretendo usarbody algo assim:

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

Mas é clarobody precisa ser convertido em um objeto parecido com um arquivo. A questão é como?

questionAnswers(1)

yourAnswerToTheQuestion