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