Получить вывод print () в реальном времени с подпроцессом

1

Я хочу выполнить файл Python из другого файла Python и показать все выходы print() выходы ошибок без ожидания (в реальном времени).

Упрощенная версия моего кода выглядит следующим образом, и я хотел бы показать "start" и сообщение об ошибке, не дожидаясь "end" (конец скрипта).

def main():
    # Function that takes a long time (in my actual code)
    x += 1 # this raises an error

if __name__ == "main":
    print("start")
    main()
    print("end")

У меня также есть run.py:

import subprocess

def run():
    subprocess.run(["python", "main.py"])


if __name__ == '__main__':
    run()

Я пробовал эту запись в блоге и несколько других похожих ответов на stackoverflow, но никто из них не работал, поэтому я решил разместить здесь свой оригинальный код, который выше.

  • 0
    попробуйте использовать check_output () stackoverflow.com/a/8235171/546375
  • 1
    С какими трудностями вы столкнулись при создании поста, на который вы ссылались? stdout буферизуется, поэтому вы можете захотеть выполнить print('start', flush=True) чтобы форсировать вывод, чтобы процесс прослушивания мог что-то извлечь ...
Показать ещё 2 комментария
Теги:
subprocess

2 ответа

1
Лучший ответ

Кажется, что для меня работает (в Windows). Он использует subprocess.Popen() для выполнения другого скрипта, потому что это дает больший контроль над тем, что происходит. Оказывается buffering от устранить любые задержки, которые могут вызвать, а также перенаправляет поток ошибок на стандартный вывод так все выходные данные могут быть получена из одного источника.. Кроме того, обратите внимание, что также включает в себя коррекцию @Ketan Mukadam упоминает это его ответ tregarding значения __name__ в вашем первом скрипте.

main_script.py:

def main():
    # Function that takes a long time (in my actual code)
    x += 1 # this raises an error

if __name__ == '__main__':
    print("start")
    main()
    print("end")

run.py:

import subprocess
import sys

def run():
    kwargs = dict(bufsize=0,  # No buffering.
                  stdout=subprocess.PIPE,
                  stderr=subprocess.STDOUT,  # Redirect stderr to stdout.
                  universal_newlines=True)
    args = [sys.executable, 'main_script.py']

    with subprocess.Popen(args, **kwargs).stdout as output:
        for line in output:
            print(line, end='')  # Process the output...

if __name__ == '__main__':
    run()

Результат выполнения run.py:

start
Traceback (most recent call last):
  File "main_script.py", line 10, in <module>
    main()
  File "main_script.py", line 6, in main
    x += 1 # this raises an error
UnboundLocalError: local variable 'x' referenced before assignment
1

Это ошибка?

if __name__ == "main":

Символ __main__ устанавливается интерпретатором, а не main. Вполне возможно, что из-за этой ошибки опечатки код не запускается из основного сценария. Попробуйте сначала выполнить основной скрипт непосредственно в командной оболочке.

  • 0
    Или просто попробуйте изменить его на if __name__ == '__main__': как должно быть ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню