Python: перенаправить вывод печати (stdout) на ведение журнала с помощью многопроцессорной обработки - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю над классом python, который использует некоторые другие классы / модули, разработанные нами самими.

Мы используем несколько отпечатков в каждом модуле, чтобы предложить некоторую информацию пользователю (регистрация также используется для более подробной информации).Проблема состоит в том, что когда (под) модули используются мастер-классом, отпечатки могут стать слишком большими и скрыть важную информацию мастера.В моем текущем приложении «мастер» - это генетический алгоритм, использующий подкласс многопроцессорной обработки (для запуска кейсов), который также использует некоторые другие подклассы (для запуска непифонного кода, для определения данных инициализации ...).Каждый класс печатает информацию, относящуюся к этому классу, хотя я только хотел бы отобразить информацию мастера.

Я пытался перенаправить sys.stdout и sys.stderr для ведения журнала.См. Ниже мою попытку на упрощенном примере.

Вызываемый модуль

from multiprocessing import Process

def send2disp(text) :
    print(text)
    return

def send2disp_mp(text) :
    workers = [Process(target=send2disp,args=(text+str(pi),)) for pi in range(2)]
    for ti in workers :
        ti.start()
    for ti in workers :
        ti.join()

if __name__ == '__main__':
    pass

Мастер сценария

from test_print import send2disp,send2disp_mp #'test_print' is the module filename
import logging
import sys

if __name__ == '__main__':

    send2disp('NoRedirection->OnStdout')

    logging.basicConfig(filename='test.log',level=logging.DEBUG,filemode='w')
    logging.info('OnLog')

    fl = logging.getLoggerClass().root.handlers[0].stream

    sys.stdout = fl
    sys.stderr = fl    

    print('InScript->IsOnLog')

    send2disp('SubModule->IsOnLog')
    send2disp_mp('ShouldBeOnlog')

Смастер-скрипт я определяю лог-файл и перенаправляю на него stdout / stderr.Затем я вызываю две функции подмодуля:

  • 'send2disp' работает хорошо, и выходные данные печати идут в журнал
  • 'send2disp_mp', вместо этого продолжайте отправлять выходные данные печати на стандартный вывод... единственное отличие заключается в использовании многопроцессорности, это должно быть источником проблемы.

Как мне справиться с перенаправлением stdout и многопроцессорностью?Заранее спасибо.

...