Там какой-либо путь состоит в том, чтобы записать двоичный выход в sys.stdout в Python 2.x? В Python 3.x можно просто использовать sys.stdout.buffer (или отсоединить stdout, и т.д....), но я не был в состоянии найти любые решения для Python 2.5/2.6.
РЕДАКТИРОВАНИЕ, Решение: Из ссылки ChristopheD, ниже:
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
Править: Я пытаюсь продвинуть файл PDF (в двоичной форме) к stdout для того, чтобы подать на веб-сервере. Когда я пытаюсь записать файл с помощью sys.stdout.write, он добавляет все виды возвратов каретки к двоичному потоку, который заставляет PDF представлять повреждение.
РЕДАКТИРОВАНИЕ 2: Для этого проекта я должен работать на Windows Server, к сожалению, таким образом, решения Linux отсутствуют.
Просто Фиктивный Пример (читающий из файла на диске, вместо того, чтобы генерировать на лету, именно так мы знаем, что код поколения не является проблемой):
file = open('C:\\test.pdf','rb')
pdfFile = file.read()
sys.stdout.write(pdfFile)
На какой платформе вы находитесь?
Вы можете попробовать этот рецепт если вы работаете в Windows (ссылка предполагает, что это все равно Windows).
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
В Интернете есть ссылки на то, что в Python 3.1 должна быть функция для повторного открытия sys.stdout
в двоичном режиме, но я действительно не знаю, есть ли лучшая альтернатива, чем указанная выше для Python 2.x.
В Python 2.x все строки по умолчанию представляют собой двоичные массивы символов, поэтому я считаю, что вы можете просто
>>> sys.stdout.write(data)
РЕДАКТИРОВАТЬ: Я подтвердил ваш опыт.
Я создал один файл gen_bytes.py
import sys
for char in range(256):
sys.stdout.write(chr(char))
и другой read_bytes.py
import subprocess
import sys
proc = subprocess.Popen([sys.executable, 'gen_bytes.py'], stdout=subprocess.PIPE)
res = proc.wait()
bytes = proc.stdout.read()
if not len(bytes) == 256:
print 'Received incorrect number of bytes: {0}'.format(len(bytes))
raise SystemExit(1)
if not map(ord, bytes) == range(256):
print 'Received incorrect bytes: {0}'.format(map(ord, bytes))
raise SystemExit(2)
print "Everything checks out"
Поместите их в тот же каталог и запустите read_bytes.py. Конечно, похоже, что Python на самом деле преобразует символы новой строки при выводе. Я подозреваю, что это происходит только в ОС Windows.
> .\read_bytes.py
Received incorrect number of bytes: 257
Следуя указаниям ChristopheD, изменение gen_bytes на следующее исправляет проблему.
import sys
if sys.platform == "win32":
import os, msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
for char in range(256):
sys.stdout.write(chr(char))
Я включаю это для полноты картины. ChristopheD заслуживает похвалы.