Я хочу выполнить файл 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, но никто из них не работал, поэтому я решил разместить здесь свой оригинальный код, который выше.
Кажется, что для меня работает (в 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
Это ошибка?
if __name__ == "main":
Символ __main__
устанавливается интерпретатором, а не main
. Вполне возможно, что из-за этой ошибки опечатки код не запускается из основного сценария. Попробуйте сначала выполнить основной скрипт непосредственно в командной оболочке.
if __name__ == '__main__':
как должно быть ...
print('start', flush=True)
чтобы форсировать вывод, чтобы процесс прослушивания мог что-то извлечь ...