Python захватывает stdout / stderr и записывает в файл, просматривая вывод - PullRequest
0 голосов
/ 31 октября 2018

Итак, у меня есть скрипт на python, который пытается автоматизировать всю процедуру сборки. Таким образом, он вызывает не только файлы python, но и сценарии оболочки, maven и т. Д. Поэтому мне нужен метод / процедура / библиотека для захвата выходных данных в stdout и stderr в файл журнала, при этом все еще выводя его на консоль, даже если вещь, печатающая на консоли, не является скриптом Python.

Мы работаем на машине с Linux, поэтому, делая это вручную, мы делаем script, затем все команды, затем exit. Но при попытке обернуть это в скрипт на python, кажется, что скрипт принимает команду оболочки и не позволяет мне запускать остальные мои команды до тех пор, пока я exit первый.

Для подтверждения концепции, вот скрипт bash, который печатает число каждые полсекунды до 10.

print_nums.bash

#!/bin/bash

for i in {1..10}
do
    echo "$i"
    sleep 0.5
done

И вот что я хочу сделать.

test_script.py

import os

def main():
    cmd1 = "script /some/arbitrary/path/logfile.txt"
    cmd2 = "/path/to/print_nums.bash"
    cmd3 = "exit"

    os.system(cmd1)

    os.system(cmd2)

    os.system(cmd3)

if __name__ == '__main__':
    main()

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

Вы можете себе представить, что команда сборки и начальное тестирование могут занимать много времени, например, 15-20 минут, то есть долго ждать, пока консоль будет ждать без вывода, если вы только что сделали

some_command.bash > logfile.txt.

1 Ответ

0 голосов
/ 06 ноября 2018

Самый простой способ для меня был ответ от Jww. Используйте tee в скрипте python вместе с os.system и tee -a, если вам нужно добавить вывод другого скрипта в тот же лог-файл.

test_script.py

import os


def main():
    cmd1 = "path/to/aribitrary_script | tee /path/to/logfile"
    cmd2 = "path/to/another_script | tee -a /path/to/logfile"

    os.system(cmd1)
    os.system(cmd2)


if __name__ == '__main__':
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...