Python 对象抛出多个实例,即使它';s为单个实例配置
我正在用Python编写代码,我面临着这样一种情况:我的对象抛出了多个实例,即使它是为单个实例配置的。因此,我有多个运行脚本的模块,还有一个名为mylogger.py的模块,它实例化了logger对象,该对象分别在文件和控制台中存储和显示脚本的日志。我正在从脚本中的多个模块调用模块mylogger.py。但是我想确保对于来自不同模块的多个调用,我使用相同的初始对象,这样我就不会在日志文件中多次插入相同的行。但我不确定,即使在正确配置之后,每次从不同模块调用函数setLogger()时,是否都会创建多个对象Python 对象抛出多个实例,即使它';s为单个实例配置,python,python-2.7,logging,multiple-instances,single-instance,Python,Python 2.7,Logging,Multiple Instances,Single Instance,我正在用Python编写代码,我面临着这样一种情况:我的对象抛出了多个实例,即使它是为单个实例配置的。因此,我有多个运行脚本的模块,还有一个名为mylogger.py的模块,它实例化了logger对象,该对象分别在文件和控制台中存储和显示脚本的日志。我正在从脚本中的多个模块调用模块mylogger.py。但是我想确保对于来自不同模块的多个调用,我使用相同的初始对象,这样我就不会在日志文件中多次插入相同的行。但我不确定,即使在正确配置之后,每次从不同模块调用函数setLogger()时,是否都会创
# mylogger.py
import logging
logger = None
def setLogger(filename="logfile.txt"):
global logger
print("*********VALUE OF LOGGER IN FUNCTION******** ", logger)
if logger is None:
logger = logging.getLogger(__name__) # creating logger object only once
if not getattr(logger, 'handler_set', None):
logger.setLevel(logging.INFO)
stream_handler = logging.StreamHandler()
file_handler = logging.FileHandler(filename)
formatter = logging.Formatter('%(message)s')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
logger.addHandler(stream_handler)
logger.setLevel(logging.INFO)
logger.propagate = False
logger.handler_set = True
return logger
我从多个模块调用此文件。我已经包括了调用mylogger.py文件的部分
#firstModule.py
import mylogger
import os
import sys
logger = mylogger.setLogger()
logger.info("Logger object in firstModule is ", logger)
# Some code
# and print statements
# goes here
# Trigger next module by calling it using os.system(...)
os.system('python' + path_of_script/secondModule.py)
现在,第二个module.py调用mylogger.py
#secondModule.py
import mylogger
import os
import sys
logger = mylogger.setLogger()
logger.info("Logger object in secondModule is ", logger)
# Some code
#and print statements
#go here
#And then it calls some other module
因此,firstModule.py和secondModule.py的logger对象基本上是不同的,接下来的模块在logfile.txt中打印出同一语句的多行。但是,通过streamHandler()在控制台上打印的行没有问题,因为它只为单个logger.info()打印出一行。这看起来很奇怪,因为streamHandler()和fileHandler()都是使用相同的函数配置的。您有两个进程(通过
os.system()
),因此您当然有不同的对象。为了“触发下一个模块”,请改用导入。我回答了您下面的问题,但这实际上可能对您没有帮助,因为我认为您问错了问题。特别是,这可能是所谓的“XY问题”。作为一个新用户,请同时阅读。