首页 文章

python logging __name__和包装

提问于
浏览
0

official python logging documentation这样说:

该名称可能是一个以句点分隔的层次结构值,例如foo.bar.baz(例如,它也可能只是普通的foo) . 在分层列表中较低的 Logger 是列表中较高的 Logger 的子项 . 例如,给定一个名为foo的 Logger ,名称为foo.bar,foo.bar.baz和foo.bam的 Logger 都是foo的后代 . Logger 名称层次结构类似于Python包层次结构,如果使用推荐的构造logging.getLogger(__ name__)基于每个模块组织 Logger ,则与其相同 . 那是因为在模块中,__ name__是Python包命名空间中的模块名称 .

但我发现最后一句不是严格正确的 . __name__ 的值似乎取决于模块的导入方式 . 以下说明了这一点:

给出两个模块,foo和bar都在包pkg中:

这是 foo

def showFoosName():
    print __name__

这是 bar

from pkg import foo
if __name__ == '__main__':
    foo.showFoosName()

跑杆产生

pkg.foo

但是,如果我们将 baz 引入包pkg,它将foo简单地导入为foo,这是合法的,因为两者都在同一个包中:

import foo
if __name__ == '__main__':
    foo.showFoosName()

奔跑巴兹 生产环境

foo

现在将这个讨论带回到日志记录和日志记录配置中,如果一个包中的导入用 from pkg import bar 语法编码,那么使用 __name__ 命名 Logger 的python日志记录建议似乎是有效的 . 这不是我所期望的 . 我原以为 __name__ 的 Value 与进口方式无关 .

2 回答

  • 0

    关于Python包和模块的事情就像Python中的其他内容一样,它们是动态的 . 每个模块的 __name__ 取决于它相对于Python根路径的位置(在 sys.path 上) . 因此,如果您有一个名为 pkg 的文件夹,即使它包含 __init__.py ,如果它直接位于 sys.path 上,它实际上不是"package" . 如果 pkg 文件夹直接在 sys.path 上(例如,因为你在那里启动了Python解释器),那么它不是一个包,其中的任何 .py 文件都是顶级模块,而不是任何包内的模块 . 因此,如果你在 pkg 文件夹中有 foo.py ,当你从 pkgfoo.py 内部启动Python解释器时,正式的名称是 foo ,而不是 pkg.foo .

    除非包含 pkg 的文件夹在 sys.path 上,否则没有包 pkg - from pkg import foo 将因 ImportError 而失败 . 如果 pkg 和包含 pkg 的文件夹都在 sys.path 上,那么您的Python路径格式错误,并且您有两个单独的可导入模块, pkg.foofoo (包含所有全局变量的独立副本!) .

    要解决此类问题,最好将可执行脚本和可导入模块和包彼此分开 . 这允许您将所有可导入的模块和包放入一个公共位置(通常在 site-packages 下用于Python安装),并且您的可执行脚本可以使用全名导入它们,无论脚本位于何处(通常,某些地方) /usr/bin/usr/local/bin ) .

  • 1

    这是导入路径被破坏的症状 . 您的路径上包含 pkg 及其包含目录,导致 foo.py 对应于两个单独的模块 foopkg.foo .

    可能,包含 pkg 的目录位于导入路径上,但您直接按文件名运行 bar.pybaz.py ,导致 pkg 本身也在路径上 . 运行

    python -m pkg.bar
    

    要么

    python -m pkg.baz
    

    应该防止 pkg 被添加到路径中 .

    那真的告诉我.1409796_t . 阅读Python导入系统应该有所帮助; here's one good resource .

相关问题