Cómo usar botocore.response.StreamingBody como stdin PIPE

Quiero canalizar archivos de video grandes de AWS S3 aPopen'sstdin, que desde el punto de vista de Python es un 'objeto similar a un archivo'. Este código se ejecuta como una función AWS Lambda, por lo que estos archivos no caben en la memoria o en el sistema de archivos local. Además, no quiero copiar estos archivos enormes en ningún lado, solo quiero transmitir la entrada, procesar sobre la marcha y transmitir la salida. Ya tengo los bits de salida de procesamiento y transmisión funcionando. El problema es cómo obtener una secuencia de entrada comoPopen pipe.

Actualización: preparé unprograma corto que invoca StreamingBody.read (amt = chunk_size) en función de un comentario. El programa lee parte del archivo de entrada (un video mp4) y se atasca, posiblemente porque el consumidor de los datos (ffmpeg) en realidad no se ejecuta, o tal vez su búfer STDIN se llena y todo el desastre se detiene.

Puedo acceder a un archivo en un cubo S3:

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

body es unbotocore.response.StreamingBody que se ve así:

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

Tengo la intención de usarbody algo como esto:

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

Pero por supuestobody necesita convertirse en un objeto similar a un archivo. La pregunta es cómo.

Respuestas a la pregunta(1)

Su respuesta a la pregunta