#python #logging #pygame #subprocess #interprocess
Вопрос:
У меня есть программа на python, которая использует pygame. Я хочу создать еще одно окно pygame для дополнительного контента и создать для этого отдельный скрипт. Я использую сокет и локальный хост для связи.
Я использую подпроцесс для запуска сценария, который отображает второе окно pygame. Этот скрипт содержит ряд сообщений журнала, которые не отображаются в выводе терминала, который я использую. Есть ли способ перенаправить сообщения журнала, чтобы они печатались на консоли вместе с сообщениями журнала основной программы?
До сих пор я настроил программу для ведения журнала, которая фиксирует зарегистрированные выходные данные:
level = logging.DEBUG
def getLogger(module_name):
wrapper = LogWrapper(module_name)
return wrapper.getLogger(),wrapper
class LogWrapper():
def __init__(self,module_name):
self.module_name = module_name
self.log_capture_string = None
self.log_trace = []
@property
def trace(self):
values = self.log_capture_string.getvalue()
self.log_trace = self.log_trace values.split("n")
return self.log_trace
def getLogger(self, **kwargs):
### Create the logger
logging.config.dictConfigClass(configuration).configure()
logger = logging.getLogger(self.module_name)
logger.setLevel(level)
### Setup the console handler with a FIFOIO object
self.log_capture_string = FIFOIO(32768)
ch = logging.StreamHandler(self.log_capture_string)
ch.setLevel(logging.DEBUG)
### Optionally add a formatter
### Add the console handler to the logger
logger.addHandler(ch)
logger.info("set up logwrap for {}".format(self.module_name))
return logger
class FIFOIO(io.TextIOBase):
def __init__(self, size, *args):
self.maxsize = size
io.TextIOBase.__init__(self, *args)
self.deque = collections.deque()
def getvalue(self):
return ''.join(self.deque)
def write(self, x):
self.deque.append(x)
self.shrink()
def shrink(self):
if self.maxsize is None:
return
size = sum(len(x) for x in self.deque)
while size > self.maxsize:
x = self.deque.popleft()
size -= len(x)
Но после запуска основной программы и вызова подпрограммы.logwrapper.trace по завершении не фиксирует никаких сообщений об ошибках из среды выполнения, только сообщение об инициализации, поэтому я ищу лучший способ доступа к этой информации.
Комментарии:
1. будьте осторожны с квадратичной сложностью
self.log_trace = self.log_trace values.split("n")
, лучше сделайтеself.log_trace.extend(values.split("n"))