将Python解析器传递给另一个模块?

2024-09-27 19:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我在main.py中有这个Python代码:

parser = argparse.ArgumentParser()
parser.add_argument("subname", help="Name of subreddit")
args = parser.parse_args()

然后在另一个文件speciallogger.py

import logging
import time

from logging.handlers import TimedRotatingFileHandler
path='logs/log_SUBNAMEHERE_logger.txt'
logmsg = logging.getLogger("Rotating Log")
fmt = u'%(asctime)s\t%(levelname)s\t%(filename)s:%(lineno)d\t%(message)s'
logmsg.setLevel(logging.INFO)
handler = TimedRotatingFileHandler(path, when="d", interval=1, backupCount=14)
handler.setFormatter(logging.Formatter(fmt))
logmsg.addHandler(handler)

脚本(以main.py开始)通过使用参数的cron执行

我需要将该参数传递给speciallogger.py,这样我就可以将文件名命名为what subname,同时确保logmsg可以跨所有模块使用,而无需在每次使用多个模块的脚本导入期间重新创建日志文件

我该怎么做


Tags: 文件pathpyimport脚本parsermainlogging
1条回答
网友
1楼 · 发布于 2024-09-27 19:31:36

speciallogger.py中创建一个函数,并在完成arg解析后立即调用该函数

speciallogger.py

import logging
import time
from logging.handlers import TimedRotatingFileHandler

def initialize(subname):
    path = f'logs/log_{subname}_logger.txt'
    logmsg = logging.getLogger("Rotating Log")
    fmt = u'%(asctime)s\t%(levelname)s\t%(filename)s:%(lineno)d\t%(message)s'
    logmsg.setLevel(logging.INFO)
    handler = TimedRotatingFileHandler(path, when="d", interval=1, backupCount=14)
    handler.setFormatter(logging.Formatter(fmt))
    logmsg.addHandler(handler)

main.py

import speciallogger
...
if __name__ == "__main__":
    ...
    parser = argparse.ArgumentParser()
    parser.add_argument("subname", help="Name of subreddit")
    args = parser.parse_args()
    speciallogger.initialize(args.subname)

logging.getLogger()将返回相同的logger对象,无论调用它的程序中的何处,根据the documentation

"All calls to this function with a given name return the same logger instance. This means that logger instances never need to be passed between different parts of an application."

因此,当您通过执行setLeveladdHandler来修改它时,您正在进行一个应该反映整个程序的持久性更改

相关问题 更多 >

    热门问题