Как установить стандартный вывод без буферизации для каждой машины?

Я столкнулся со случаем, когда моя машина буферизовала стандартный вывод, но машина коллеги НЕ буферизовала стандартный вывод для точно такого же кода. У нас почти идентичные среды (мы используем один и тот же образ виртуальной машины в 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" (здесь не воспроизводится).

0 ответов

Другие вопросы по тегам