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 回答
关于Python包和模块的事情就像Python中的其他内容一样,它们是动态的 . 每个模块的
__name__
取决于它相对于Python根路径的位置(在sys.path
上) . 因此,如果您有一个名为pkg
的文件夹,即使它包含__init__.py
,如果它直接位于sys.path
上,它实际上不是"package" . 如果pkg
文件夹直接在sys.path
上(例如,因为你在那里启动了Python解释器),那么它不是一个包,其中的任何.py
文件都是顶级模块,而不是任何包内的模块 . 因此,如果你在pkg
文件夹中有foo.py
,当你从pkg
,foo.py
内部启动Python解释器时,正式的名称是foo
,而不是pkg.foo
.除非包含
pkg
的文件夹在sys.path
上,否则没有包pkg
-from pkg import foo
将因ImportError
而失败 . 如果pkg
和包含pkg
的文件夹都在sys.path
上,那么您的Python路径格式错误,并且您有两个单独的可导入模块,pkg.foo
和foo
(包含所有全局变量的独立副本!) .要解决此类问题,最好将可执行脚本和可导入模块和包彼此分开 . 这允许您将所有可导入的模块和包放入一个公共位置(通常在
site-packages
下用于Python安装),并且您的可执行脚本可以使用全名导入它们,无论脚本位于何处(通常,某些地方)/usr/bin
或/usr/local/bin
) .这是导入路径被破坏的症状 . 您的路径上包含
pkg
及其包含目录,导致foo.py
对应于两个单独的模块foo
和pkg.foo
.可能,包含
pkg
的目录位于导入路径上,但您直接按文件名运行bar.py
和baz.py
,导致pkg
本身也在路径上 . 运行要么
应该防止
pkg
被添加到路径中 .那真的告诉我.1409796_t . 阅读Python导入系统应该有所帮助; here's one good resource .