Подробнее о буферизации потоков ввода-вывода:. pty и Pexpect

podrobnee o buferizacii potokov vvoda vyvoda pty i pexpect Системные инструменты параллельного выполнения

В Unix-подобных системах для принудительного перевода потока стандартного вывода других программ в небуферизованный режим можно также использовать модуль pty из стандартной библиотеки Python, что особенно удобно, если эти другие программы написаны не на языке Python и вы не имеете возможности изменить их программный код.

Технически режим буферизации потока вывода stdout в других программах определяется за пределами интерпретатора Python, посредством проверки — подключен ли дескриптор потока вывода к терминалу. Эта проверка выполняется в стандартной библиотеке ввода-вывода файловой системы, и ее результаты не могут контролироваться порождаемыми программами.

В целом, когда стандартный поток вывода подключен к терминалу, для него используется режим построчной буферизации, а при подключении к другим устройствам (включая файлы, каналы и сокеты) используется режим полной буферизации. Такая политика применяется с целью повышения эффективности. Файлы и потоки ввода-вывода, создаваемые внутри сценариев на языке Python, следуют тем же правилам, но в них вы можете явно указать политику буферизации с помощью инструментов создания файлов.

Модуль pty фактически обманывает порожденную программу, заставляя ее думать, что она подключена к терминалу, благодаря чему в буфере потока вывода stdout сохраняется только одна строка. В результате появление в потоке вывода каждого нового символа перевода строки приводит к выталкиванию предыдущей строки из буфера, что типично для интерактивных программ и именно то, что нужно, если вы предполагаете получать строки по мере их воспроизведения.

Однако обратите внимание, что модуль pty не требуется применять для изменения режима буферизации потоков ввода-вывода при запуске сценариев на языке Python: просто используйте ключ u командной строки, передавайте инструментам создания файлов аргументы, определяющие режим построчной буферизации, или вручную вызывайте метод sys.stdout.flush() в порождаемых программах. Кроме того, модуль pty на сегодняшний день доступен в Python не на всех платформах (он имеется в версии Python для Cygwin, но отсутствует в стандартной версии для Windows).

Пакет Pexpect, эквивалент программы expect для Unix на языке Python, использует модуль pty для обеспечения дополнительной функциональности и взаимодействий в обход стандартных потоков ввода-вывода (например, для ввода пароля). Более подробную информацию о модуле pty вы можете найти в руководстве по библиотеке Python, а также попробуйте поискать информацию о пакете Pexpect в Интернете.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий