Я работаю над классом 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 и многопроцессорностью?Заранее спасибо.