Python 2.x - Записать двоичный выход в stdout?

Там какой-либо путь состоит в том, чтобы записать двоичный выход в 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)
35
задан Eavesdown 3 March 2010 в 20:32
поделиться

2 ответа

На какой платформе вы находитесь?

Вы можете попробовать этот рецепт если вы работаете в 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.

29
ответ дан 27 November 2019 в 07:16
поделиться

В 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 заслуживает похвалы.

7
ответ дан 27 November 2019 в 07:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: