2015-06-23 24 views
0

正确初始化导入模块我有一个文件test.py可以用Python

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() 

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

+0

我认为'func()'不能识别'logger'作为一个全局变量,因为你没有告诉它这么做。你有没有尝试之前添加一个'全球记录器'行?看看这个:http://stackoverflow.com/questions/423379/using-global-variables-in-a-function-other-than-the-one-that-c​​reated-them – tomasyany

+0

这是因为你定义'记录器'在'main'部分,所以它永远不会被导入。 –

回答

0
#!/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的方法,但因为当你运行它作为一个脚本(这是__main__部分)您logger变量只初始化,当func()被调用,因此不能识别变量它不是初始化。这也意味着当another_fun()调用func()时,由于another_fun()不是在您的test.py模块中调用__main__,因此未找到记录器对象。

+0

是的,我没有导入日志。而且我确实在getLogger()中放了name参数,对不起,我为了简单起见在这里省略了它。现在我把记录器初始化放在func()下,但它仍然给我“NameError:全局名称'记录器'未定义”。我不明白为什么我应该用两种方法。 –

+0

如果出现竞争条件,或者其他模块导入了您的模块,但其他模块中定义了重要对象。基本上它有助于涉及线程或多处理,并且是最佳实践。这不是必需的,但建议。 如果记录器没有定义,那么它似乎你的记录器对象没有被初始化或超出范围 – NuclearPeon

+0

我也没有得到任何错误,当我运行你的代码,复制粘贴,使可执行文件,并包括一个hashbang。你在linux上运行,你如何执行你的脚本? 编辑:更正:找到你的错误 – NuclearPeon

0

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

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

+0

如果我只是想从该模块导入一个函数,我该如何初始化该变量?把它们放在函数定义之前? –