Как имитировать «myscript.py > mylog.txt «

#python #logging

#python #ведение журнала

Вопрос:

Я пытаюсь реализовать опцию, которая дополнительно сохранит вывод консоли в файл. (если опция активирована)

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

 class MyWriter: 
    def __init__(self, stdout, filename): 
        self.stdout = stdout 
        self.logfile = file(filename, 'a') 
    def write(self, text): 
        self.stdout.write(text) 
        self.logfile.write(text) 
    def close(self): 
        self.stdout.close() 
        self.logfile.close()  
  

Но у меня проблема.
Некоторые фрагменты кода будут выполняться в новом процессе. И этот способ не улавливает их отпечатки.

Когда я запускаю свою программу, как

 "myscript.py > mylog.txt"
  

это работает. Он получил все отпечатки. Но как я могу функционально имитировать это в моем скрипте?

Комментарии:

1. Как создаются эти процессы? Вы сами запускаете эти процессы или они вызываются каким-то другим кодом поддержки?

Ответ №1:

Если я вас правильно понимаю, вы хотите перенаправить stdout другой процесс, который вы запускаете правильно?

Тогда все, что вам нужно сделать, это использовать

 subprocess.Popen(...)
  

команда. Затем вы должны использовать свой MyWriter класс с ним.

Комментарии:

1. Я также использую этот класс в своем новом процессе. Это работает. Спасибо вам, ребята.

Ответ №2:

Мое предложение состояло бы в том, чтобы использовать модуль ведения журнала, использовать sockethandler и отправлять на сервер сокетов, который записывал бы полученные журналы в файл.

Я надеюсь, что это поможет

Ответ №3:

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