Как использовать botocore.response.StreamingBody в качестве стандартного ТРУБА

Я хочу передать большие видеофайлы из AWS S3 вPopen«sstdin, который с точки зрения Python является «файловым объектом». Этот код работает как лямбда-функция AWS, поэтому эти файлы не помещаются в память или локальную файловую систему. Кроме того, я не хочу никуда копировать эти огромные файлы, я просто хочу транслировать ввод, обрабатывать на лету и выводить поток. У меня уже есть биты обработки и потокового вывода. Проблема в том, как получить входной поток в виде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']  

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 должен быть преобразован в подобный файлу объект. Вопрос в том, как?

Ответы на вопрос(1)

Ваш ответ на вопрос