Как получить вывод в реальном времени с помощью subprocess / os.system и записать вывод в файл `log.txt`? - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь получить в реальном времени вывод Windows tracert и в то же время сохранить журнал в log.txt.

Это код для сохранения вывода в файл log.txt.

import sys

class Tee(object):
  def __init__(self, log_fname, mode='a'):
    self.log = open(log_fname, mode)

  def __del__(self):
    sys.stdout = sys.__stdout__
    sys.stdir = sys.__stdin__
    sys.stderr = sys.__stderr__
    self.log.close()

  def write(self, data):
    self.log.write(data)
    self.log.flush()
    sys.__stdout__.write(data)
    sys.__stdout__.flush()

  def readline(self):
    s = sys.__stdin__.readline()
    sys.__stdin__.flush()
    self.log.write(s)
    self.log.flush()
    return s

  def flush(foo):
    return

sys.stdout = sys.stderr = sys.stdin = Tee('log.txt', 'w')

Я читал почти похожую тему здесь Получение вывода в реальном времени с использованием подпроцесса , но мне пока не повезло с решениями, так как я все еще новичок в модуле subprocess.

Вот мои tracert попытки в Python3 с subprocess и os.system модулем.

1-я попытка

IP = '10.2.2.2'

код

print(subprocess.check_output('tracert %s' % IP, shell=True, universal_newlines=True))

Вывод на консоль НЕ в реальном времени

Tracing route to 10.2.2.2 over a maximum of 30 hops

  1     1 ms     1 ms    <1 ms  10.1.1.1
  2    <1 ms     1 ms     1 ms  10.2.2.2

Trace complete.

log.txt ОК

Tracing route to 10.2.2.2 over a maximum of 30 hops

  1    <1 ms    <1 ms    <1 ms  10.1.1.1 
  2     1 ms     1 ms    <1 ms  10.2.2.2 

Trace complete.

2-я попытка

Код

print(subprocess.run('tracert %s' % IP, shell=True, universal_newlines=True))

Вывод на консоль = в режиме реального времени с дополнительными CompletedProcess(args='tracert 10.2.2.2', returncode=0

Tracing route to 10.2.2.2 over a maximum of 30 hops

  1    <1 ms    <1 ms    <1 ms  10.1.1.1
  2    <1 ms    <1 ms    <1 ms  10.2.2.2

Trace complete.
CompletedProcess(args='tracert 10.2.2.2', returncode=0)

log.txt = не в порядке

CompletedProcess(args='tracert 10.2.2.2', returncode=0)

3-е попытки

Код

os.system('tracert %s' % IP)

Консольный выход = ОК, Реальное время

Tracing route to 10.2.2.2 over a maximum of 30 hops

  1    <1 ms    <1 ms    <1 ms  10.1.1.1
  2    <1 ms     1 ms    <1 ms  10.2.2.2

Trace complete.

log.txt = Ничего

4-е попытки

Код

print(os.system('tracert %s' % IP))

Выход на консоль = ОК, в режиме реального времени

Tracing route to 10.2.2.2 over a maximum of 30 hops

  1    <1 ms    <1 ms    <1 ms  10.1.1.1
  2    <1 ms     1 ms    <1 ms  10.2.2.2

Trace complete.

log.txt = 0

0

Можно ли получить в режиме реального времени tracert вывод и в то же время записать все (точно то же самое) на консоли в файл log.txt?

Если есть более простой / лучший способ сделать это, пожалуйста, дайте мне знать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...