После поиска я определил функцию для выполнения команды, как в терминале:
import shlex
import subprocess
def execute_cmd(cmd):
p = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
for line in iter(p.stdout.readline, b''): # b'' here for python3
sys.stdout.write(line.decode(sys.stdout.encoding))
error = p.stderr.read().decode()
if error:
raise Exception(error)
Он работает нормально (вывод в реальном времени), когда я
execute_cmd('ping -c 5 www.google.com')
Однако, когдая использую execute_cmd
для запуска скрипта Python, вывод будет распечатан до завершения процесса.
execute_cmd('python test.py')
script: test.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import time
print('hello')
time.sleep(2)
print('hello, again')
Как я могу это исправить?спасибо!
Извините, что не объяснил, почему «перехватите стандартный вывод и снова запишите его в стандартный вывод».Здесь я действительно хочу поймать вывод сценариев в логгер, логгер выводит их на экран (StreamHandler) и файл журнала (FileHandler).Я собрал и протестировал часть логгера, теперь часть «выполнить».И игнорировать параметр stdout=
, кажется, не работает.
конвейер:
- регистратор настроек;
- перенаправить STDOUT, STDERR на регистратор;
- выполнить сценарии;
Из-за шага 2, если я игнорирую параметр stdout=
, выходные данные сценариев будут по-прежнему выводиться в STDOUT и не будут регистрироваться в файле.
Может быть, яможно установить stdout=
в логгер?