Ausgabe von Binärdaten aus CGI in Python 3

Diese Frage bezieht sich auf diese . Ich hatte keine Probleme beim Drucken von rohen Binärdaten aus einem CGI-Skript in Python 2, zum Beispiel:

#!/usr/bin/env python2 import os if __name__ == '__main__': with open(os.path.abspath('test.png'), 'rb') as f: print "Content-Type: image/png\n" print f.read() 

Hier sind die relevanten Antwort-Header:

 > GET /cgi-bin/plot_string2.py HTTP/1.1 > User-Agent: curl/7.32.0 > Host: 0.0.0.0:8888 > Accept: */* > * HTTP 1.0, assume close after body < HTTP/1.0 200 Script output follows < Server: SimpleHTTP/0.6 Python/3.3.2 < Date: Fri, 13 Sep 2013 16:21:25 GMT < Content-Type: image/png 

Und das Ergebnis wird wie erwartet als Bild interpretiert. Allerdings, wenn ich versuche, eine Übersetzung zu Python 3 zu machen:

 #!/usr/bin/env python import os import sys if __name__ == '__main__': with open(os.path.abspath('test.png'), 'rb') as f: print("Content-Type: image/png\n") sys.stdout.buffer.write(f.read()) 

Nichts wird zurückgegeben, und hier sind die Header:

 > GET /cgi-bin/plot_string3.py HTTP/1.1 > User-Agent: curl/7.32.0 > Host: 0.0.0.0:8888 > Accept: */* > * HTTP 1.0, assume close after body < HTTP/1.0 200 Script output follows < Server: SimpleHTTP/0.6 Python/3.3.2 < Date: Fri, 13 Sep 2013 16:22:13 GMT <  PNG < 

Ich kann nicht mehr print(f.read()) weil das so etwas wie b'\x89PNG\r\n\x1a\n\x00... . Die Frage, die ich verknüpft habe, gibt eine Lösung, aber anscheinend funktioniert das nicht in dieser Umgebung.

Gedanken?

Hinzugefügt : Hinweis für die Zukunft :

Das bedeutet auch, dass das print für CGI nicht mehr gut ist.

One Solution collect form web for “Ausgabe von Binärdaten aus CGI in Python 3”

Verwenden Sie sys.stdout.flush , um den Header zu drucken, der vor dem Körper gedruckt wird:

 import os import sys if __name__ == '__main__': with open(os.path.abspath('test.png'), 'rb') as f: print("Content-Type: image/png\n") sys.stdout.flush() # <--- sys.stdout.buffer.write(f.read()) 

Oder entfernen Sie print und verwenden sys.stdout.buffer.write nur sys.stdout.buffer.write :

 import os import sys if __name__ == '__main__': with open(os.path.abspath('test.png'), 'rb') as f: sys.stdout.buffer.write(b"Content-Type: image/png\n\n") # <--- sys.stdout.buffer.write(f.read()) 

HINWEIS

f.read() könnte ein Problem verursachen, wenn die Datei riesig ist. Um dies zu verhindern, verwenden Sie shutil.copyfileobj :

 import os import shutil import sys if __name__ == '__main__': with open(os.path.abspath('test.png'), 'rb') as f: sys.stdout.buffer.write(b"Content-Type: image/png\n\n") shutil.copyfileobj(f, sys.stdout.buffer) 
  • StringIO in python3
  • Was macht eine benutzerdefinierte Klasse unerschütterlich?
  • Python3 AttributeError: 'list' Objekt hat kein Attribut 'clear'
  • BeautifulSoup funktioniert nicht und bekommt keinen Fehler
  • Python-String-Argument ohne Codierung
  • Erkennung von Nicht-Ascii-Zeichen in Unicode-String
  • Django-Modell "nicht deklarieren eine explizite app_label"
  • Python befreien von Bytes b ''
  • BestelltDict in python 3 - wie bekommst du die Schlüssel in Ordnung?
  • Warum ist String-Verkettung in Python wichtig?
  • Maximaler Wert aus jeder Spalte der CSV-Datei
  • Python ist die beste Programmiersprache der Welt.