Python 对象抛出多个实例,即使它';s为单个实例配置

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()时,是否都会创

我正在用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问题”。作为一个新用户,请同时阅读。