3

现在我正在尝试更大的程序,我想使用日志记录模块而不是在我的代码中添加打印。但我一开始就摔倒了。我有一个两页的程序,添加了我能做的最简单的日志记录,但它没有用。所以,我运行了这个例子,它奏效了。然后,我将我的代码逐行运入示例中,直到找到阻止它的原因。一个近乎空的模块的简单导入会停止正确的日志记录行为。

# import ntu.dummy
import logging
LOG_FILENAME = 'example_15.log'
print 'before basicconfig'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
print 'before log write'
logging.debug('This message should go to the log file')
print 'after log write'

使用# import ntu.dummy,程序运行,打印出调试信息,并将预期的.log 文件连同预期的内容一起存放到程序的文件夹中。在 IDLE 中或直接在操作系统中都是如此。

如果我删除 # 以允许 import ntu.dummy 执行,则程序运行,打印我的调试,但没有创建 .log 文件,既不在程序文件夹中,也不在机器上的任何其他位置创建 AFAICS。

C:\Python26\Lib\ntu\ 包含一个 __init__.py,而这个文件 dummy.py,其内容...

def bolleaux():
    """ empty function """
    return None

代替 import ntu.dummy 语句,我可以有各种其他导入,随机、Tkinter、os.path,它们不会导致日志记录失败

求助,请问这是怎么回事?

4

1 回答 1

0

嗬!

ntu 包包含许多其他单一功能或单一类模块,真正便于测试和更新。其中一些来自朋友,所以我不熟悉其中的内容。由于包的宽度越来越笨重,他建议在 __init__.py 我放...

from modname import ClassName

对于我在那里的每个模块,然后将 ClassName 带入 ntu 命名空间。这意味着当我想使用任何模块时,我只需使用

import ntu       # instead of import ntu.modname for each module !

当然,是的,他的一个模块在类定义之前的模块级别执行了 logging.basicConfig。因此,即使我只导入我的模块,这样做也会运行 __init__,它会导入他的模块,这会扰乱后续使用日志记录。注释掉该链中的任何链接会使日志记录正常工作。

我不确定在包中使用 import 是否能节省这么多,它让我对这种讨厌的副作用持开放态度。因此,我将返回从 packname.modname 导入所有模块。

但我会想在某个时候使用那个狡猾的模块,所以必须让它更安全,或者让他让它更安全。

非常感谢

于 2013-01-19T07:57:56.823 回答