【问题标题】:One class instance used automatically throughout process一个类实例在整个过程中自动使用
【发布时间】:2015-06-01 02:37:09
【问题描述】:

python 日志记录模块一旦导入和实例化,就会跨进程,在所有模块和线程中。他们是如何达到这种效果的?

示例:

myapp.py

import logging
import mylib

def main():
    logging.basicConfig(filename='myapp.log', level=logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

mylib.py

import logging

def do_something():
    logging.info('Doing something')

myapp.log

INFO:root:Started
INFO:root:Doing something
INFO:root:Finished

【问题讨论】:

  • 为什么不看看logging.py是如何实现的? hg.python.org/cpython/file/2.7/Lib/logging/__init__.py
  • 这是导入模块的标准行为。您自己的模块的行为是否有所不同?
  • @Alik 如果文件没有 1742 行,我会说你的建议很好;)
  • @alfasin 您无需阅读整个文件即可了解如何在模块中的任何位置使用一个实例。
  • @Alik 对,这就是为什么您的评论应该包含对相关行的更具体引用;)

标签: python class python-2.7 logging


【解决方案1】:

第一次导入模块时,将加载的模块对象放入sys.modules。以后的导入将找到模块对象,而不是重新加载模块。

日志模块有一堆模块属性,它们保存第一次导入后的日志配置状态。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多