Wie verwendet man botocore.response.StreamingBody als stdin PIPE

Ich möchte große Videodateien von AWS S3 in @ leitePopen 'sstdin, das aus Pythons Sicht ein 'dateiähnliches Objekt' ist. Dieser Code wird als AWS Lambda-Funktion ausgeführt, sodass diese Dateien nicht in den Arbeitsspeicher oder in das lokale Dateisystem passen. Außerdem möchte ich diese riesigen Dateien nirgendwo kopieren, sondern nur die Eingabe streamen, im laufenden Betrieb verarbeiten und die Ausgabe streamen. Ich habe bereits die verarbeitenden und strömenden Ausgangsbits erhalten, die arbeiten. Das Problem ist, wie man einen Eingabestream als @ erhälPopen pipe.

Update: Ich habe ein @ zusammengestelKurzprogramm, das StreamingBody.read (amt = chunk_size) basierend auf einem Kommentar aufruft. Das Programm liest einen Teil der Eingabedatei (ein mp4-Video) und bleibt hängen, möglicherweise weil der Konsument der Daten (ffmpeg) nicht wirklich läuft, oder vielleicht füllt sich der STDIN-Puffer und das ganze Durcheinander kommt zum Stillstand?

Ich kann auf eine Datei in einem S3-Bucket zugreifen:

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

body ist einbotocore.response.StreamingBody was so aussieht:

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

Ich beabsichtige, @ zu verwendbody etwas wie das

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

Aber natürlichbody muss in ein dateiähnliches Objekt konvertiert werden. Die Frage ist wie?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage