2013-10-03 2 views
2

Я запускаю внешний процесс, и мне нужно немедленно получить stdout, чтобы я мог нажать его в текстовое представление, на GNU/Linux я могу использовать «usePTY = True «чтобы получить стандартную строку, к сожалению, usePTY недоступен в окнах.скрученный реактор.spawnProcess get stdout w/o bufffering на окнах

Я довольно новичок в скручивании, есть ли способ добиться такого же результата в Windows с помощью некоторых искаженных (или python) магических вещей?

ответ

9

на GNU/Linux можно использовать "usePTY = True", чтобы получить стандартный вывод построчно

Рода! Что действительно делает usePTY=True, это создать PTY («псевдотерминал») - вещь, которую вы всегда получаете, когда вы входите в оболочку на GNU/Linux, если у вас нет реального терминала, который больше никто не делает :) вместо скучная старая труба. PTY очень похож на трубку, но у нее есть некоторые дополнительные функции - но что более важно для вас, PTY сильно связан с интерактивными сеансами (то есть, пользователь), тогда как труба очень сильно связана с программным использованием (подумайте foo | bar - ни один пользователь не видит выход foo).

Это означает, что люди склонны использовать существование PTY как stdout как сигнал о том, что они должны производить вывод своевременно - потому что человек ждет его увидеть. С другой стороны, существование обычной старой трубы как stdout берется как сигнал о том, что другая программа потребляет выход, и они должны вместо этого производить выход в максимально возможном пути.

Что это правила означает на практике, что если программа имеет PTY затем он будет выстраиваться буфером своего выхода, и если у него есть труба, то он будет «блок» буферный своим выход (обычно собирается около 4 килобайт данных, прежде чем писать какие-либо из них) - потому что буферизация строк менее эффективна.

Следует отметить, что это программа, которую вы используете, которая выполняет эту буферизацию. Независимо от того, проходите ли вы usePTY=True или usePTY=False, это не имеет прямого значения для этой буферизации: это всего лишь подсказка к программе, в которой вы работаете, какой буферизацией вывода она должна делать.

Это означает, что вы можете запускать программы, которые блокируют буфер, даже если вы пройдете usePTY=True и наоборот.

Однако ... Windows не имеет PTY. Таким образом, программы в Windows не могут рассматривать PTY как подсказку для того, как буферировать их вывод.

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

Если вам повезет, то у программы, в которой вы работаете, будет некоторая способ для запроса вывода с линейной буферизацией. Если вы используете Python, то это делает - переменная среды PYTHONUNBUFFERED управляет этим, также как и параметр командной строки -u (и я думаю, что они оба работают в Windows).

Кстати, если вы планируете передать двоичные данные между этими двумя процессами, то вы, вероятно, также хотите положить STDIO в двоичном режиме в дочернем процессе, а также:

import os, sys, mscvrt                             
    msvcrt.setmode(sys.stdin.fileno(), os.O_BINARY)                       
    msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)                       
    msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)   
+0

спасибо за подробный ответ – gianmt

Смежные вопросы