在 Python 中导入具有正确初始化的模块

Import modules with proper initialization in Python

我有一个文件test.py:

import logging

def func():
    logger.info('some info')

if __name__ == '__main__':
    logger = logging.getLogger()
    func()

运行良好。当我从另一个文件中测试导入 func 并调用 func() 方法时,它给我 global name 'logger' is not defined 错误。

from test import func
def another_fun():
    func()

即使我在调用 func() 之前将 logger = logging.getLogger() 放入 another_func(),它仍然会给我这样的错误。我想知道在这种情况下,通过正确初始化从其他文件导入函数的标准方法是什么。非常感谢。

不要在 if __name__ == '__main__' 中初始化东西。这是当您的文件作为脚本执行时将 运行 的代码。理想情况下,它应该只包含一个函数调用,而不包含其他任何内容。

您也不能在不同的模块中定义全局变量。每个模块都有自己独立的一组全局变量。您必须在 test.py 模块中初始化 logger

#!/usr/bin/env python3
import logging
logger = logging.getLogger("funclogger") # all modules importing this get access to funclogger log object

def func():    
    logger.info('some info')

if __name__ == '__main__':
    func()

其他进程调用another_func():

#!/usr/bin/env python3
import logging
logger = logging.getLogger("funclogger") # May not be needed if this module doesn't log
from test import func

def another_fun():
    func()

就像@Kevin 提到的那样。

another_fun() 调用 test.py 中的方法,但是由于 logger 变量仅在 运行 作为脚本(即 __main__ 部分),它在调用 func() 时未初始化,因此无法识别该变量。这也意味着当 another_fun() 调用 func() 时,找不到记录器对象,因为 another_fun() 不会 在您的 test.py模块。