Чтение двоичных данных из стандартного ввода - PullRequest
25 голосов
/ 17 мая 2010

Возможно ли читать stdin как двоичные данные в Python 2.6?Если да, то как?

В документации Python 3.1 я вижу, что это довольно просто, но возможности для этого в 2.6, похоже, отсутствуют.

Если методы, описанные в 3.1, недоступны, есть ли способ закрыть стандартный ввод и снова открыть его в двоичном режиме?

Обновление

Просто для ясностиЯ использую 'type' в оболочке MS-DOS, чтобы передать содержимое двоичного файла в мой код Python.Насколько я понимаю, это должно быть эквивалентно команде Unix 'cat'.Но когда я проверяю это, я всегда получаю на один байт меньше ожидаемого размера файла.

Обновление # 2

Прежде всего, спасибо за все ответы.Я медленно работаю над реальным, пригодным для использования решением здесь.В конце концов, я все еще пытаюсь создать автономный JAR-файл, который автоматически выполняет мой код Python, пропуская все незаполненные аргументы командной строки.

Причина, по которой я иду по маршруту Java / JAR / Jython, заключается в том, что одна из моих основных внешних библиотек доступна только как Java JAR.Но, к сожалению, я начал работать как Python.Возможно, было бы проще преобразовать мой код в Java некоторое время назад, но, поскольку все эти вещи должны были быть совместимыми, я подумал, что попробую перебрать их и докажу, что это возможно.

В случаевсем было интересно, это также связано с вопросом, который я задал несколько дней назад.

Упаковка и развертывание Jython-программы из Eclipse

На некоторые вопросы был дан ответв этом вопросе .

Поэтому я попытаюсь обновить свой оригинальный вопрос некоторыми примечаниями о том, что я выяснил до сих пор.

Ответы [ 6 ]

22 голосов
/ 31 января 2011

Из документов (см. здесь ):

Стандартные потоки в текстовом режиме по умолчанию. Написать или прочитать двоичный файл данные к ним, использовать основную двоичный буфер. Например, написать байты в стандартный вывод, используйте sys.stdout.buffer.write(b'abc').

Но, как и в принятом ответе, вызов python с -u является еще одним вариантом, который заставляет stdin, stdout и stderr быть полностью небуферизованными. Для получения дополнительной информации см. Справочную страницу python (1).

См. Документацию по io для получения дополнительной информации о буферизации текста и используйте sys.stdin.detach() для отключения буферизации из Python.

13 голосов
/ 14 августа 2016

Вот окончательный вариант кода, совместимого с Linux / Windows Python 2/3, для чтения данных со стандартного ввода без повреждения:

12 голосов
/ 17 мая 2010

Используйте переключатель 1002 * командной строки , чтобы заставить Python 2 обрабатывать stdin, stdout и stderr как двоичные небуферизованные потоки.

C:> type mydoc.txt | python.exe -u myscript.py
9 голосов
/ 12 ноября 2010

Если вам все еще нужно это ... Этот простой тест, который я использовал для чтения двоичного файла, который содержит символ 0x1A между

import os, sys, msvcrt

msvcrt.setmode (sys.stdin.fileno(), os.O_BINARY)
s = sys.stdin.read()
print len (s)

Данные моего тестового файла были:

0x23, 0x1A, 0x45

Без установки стандартного ввода в двоичный режим этот тест печатает 1, как только он обрабатывает 0x1A как EOF. Конечно, это работает только для Windows, потому что зависит от модуля msvcrt.

0 голосов
/ 15 апреля 2019

Вы можете выполнить небуферизованное чтение с помощью:

os.read(0, bytes_to_read)

с 0 является дескриптором файла для стандартного ввода

0 голосов
/ 17 мая 2010
import sys

data = sys.stdin.read(10) # Read 10 bytes from stdin

Если вам нужно интерпретировать двоичные данные, используйте модуль struct.

...