было бы неплохо, но мне придется сделать это с помощью переменной среды PYTHONUNBUFFERED. Характеристики приложения затрудняют легкое добавление еще одного модуля.

ужно прочитать вывод от дочернего процесса, как он производится - возможно, не на каждомwrite, но задолго до завершения процесса. Я пробовал решения из документов Python3 и вопросов SOВот а такжеВот, но я все еще ничего не получаю, пока ребенок не кончает.

Приложение для мониторинга обучения модели глубокого обучения. Мне нужно получить выходные данные теста (около 250 байт для каждой итерации с интервалом примерно в 1 минуту) и следить за статистическими ошибками.

Я не могу изменить тренировочный двигатель; например, я не могу вставитьstdout.flush() в коде дочернего процесса.Я могу разумно ждать, пока накопится дюжина строк; Я надеялся, что заполнение буфера решит мою проблему.

Код: варианты закомментированы.

родитель

cmd = ["/usr/bin/python3", "zzz.py"]
# test_proc = subprocess.Popen(
test_proc = subprocess.run(
    cmd,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT
    )

out_data = ""
print(time.time(), "START")
while not "QUIT" in str(out_data):
    out_data = test_proc.stdout
    # out_data, err_data = test_proc.communicate()
    print(time.time(), "MAIN received", out_data)

Ребенок (zzz.py)

from time import sleep
import sys

for _ in range(5):
    print(_, "sleeping", "."*1000)
    # sys.stdout.flush()
    sleep(1)

print("QUIT this exercise")

Несмотря на отправку строк размером более 1000 байт, заполнение буфера (проверенное в другом месте как 2 КБ; здесь у меня дошло до 50 КБ) заполнение не заставляет родителя «видеть» новый текст.

Чего мне не хватает, чтобы заставить это работать?

Обновление в отношении ссылок, комментариев иiBugВыложил ответ:

Popen вместоrun исправлена ​​проблема блокировки. Каким-то образом я пропустил это в документации и моих экспериментах с обоими.universal_newline=True аккуратно измененные байты возвращаются в строку: легче обрабатывать на принимающей стороне, хотя с чередующимися пустыми строками (легко обнаружить и выбросить).настройкаbufsize к чему-то крошечному (например,1) ничего не повлияло; родитель все еще должен ждать ребенка, чтобы заполнитьstdout буфер, 8к в моем случае.export PYTHONUNBUFFERED=1 перед казньюсделал исправить проблему буферизации. Благодаряwim по ссылке.

Если кто-то не придумает канонического, изящного решения, которое делает их устаревшими, я приму ответ iBug завтра.

Ответы на вопрос(1)

Ваш ответ на вопрос