на 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)
спасибо за подробный ответ – gianmt