Как установить стандартный вывод без буферизации для каждой машины?
Я столкнулся со случаем, когда моя машина буферизовала стандартный вывод, но машина коллеги НЕ буферизовала стандартный вывод для точно такого же кода. У нас почти идентичные среды (мы используем один и тот же образ виртуальной машины в VMware Player, но он на Mac, а я на ПК). Код использует Popen() для выполнения одного скрипта Python из другого, и исполняемый скрипт буферизует стандартный вывод на моем компьютере, но не его.
Я знаю об этих способах управления буферизацией stdout в python: Отключить буферизацию вывода
Но ни на одной машине не была установлена переменная среды PYTHONUNBUFFERRED, и ни одно из программных средств для отмены буферизации stdout не использовалось ни в одном коде.
Кстати, добавление "-u" к вызову Popen() привело к тому, что stdout был небуферизован на моей машине, но не изменил его поведение.
Принимая во внимание эту преамбулу, что может вызвать буферизацию stdout на одной машине и отсутствие буферизации на другой для идентичного кода, в противном случае?
Это может быть эзотерически, но важно, чтобы я мог дать подробное объяснение, и у меня закончились идеи для поисковых строк.
РЕДАКТИРОВАТЬ: Первоначальная программа может быть вызвана из командной строки или ссылки на рабочем столе (которая выдает команду bash). Виртуальная машина работает под управлением Ubuntu Linux. Я постараюсь опубликовать простой пример кода, но это может занять некоторое время.
Думая о вызове, я только что понял, что обычно запускаю из командной строки, а он обычно запускается из ярлыка на рабочем столе, что может быть критическим отличием. Но я до сих пор не знаю, почему...
Вот некоторый код, который демонстрирует, что я делаю (в основном; это гораздо больше, но мне сложно понять, что имеет значение).
process = Popen(['python', '-u', 'some_script.py'], shell=False, stdout=PIPE)
char = ''
while char != '\n' and len(read) > 0:
read, write, exception = select([stdout],[],[],0)
if read is not None and len(read) > 0:
char = stdout.readline(1)
output_buffer += char
#end while
if char == '\n':
print output_buffer
output_buffer = ''
Вызывающий скрипт вызывает Popen, а затем выполняет неблокирующее буферизованное чтение, выбирая на stdout чтение символа, пока он не получит \n или нечего читать.
Вызванный скрипт в основном просто печатает строку текста с использованием "print" (здесь не воспроизводится).