Python库导入遇AttributeError,调用help()后异常消失的原因排查
Python库导入异常问题分析与解决
两种导入方式的本质差异
from test_package import myutils:这种写法会直接把myutils子模块导入到当前命名空间,同时Python会自动把myutils作为属性挂载到test_package父模块对象上,所以后续不管是直接用myutils还是通过test_package.myutils都能访问。import test_package:这种写法只加载了顶层的test_package模块,默认不会自动加载它的子模块。此时test_package的属性里根本没有myutils,直接调用自然会报AttributeError。
为什么调用help()后就正常了?
help('test_package.myutils.test_utils')执行时,Python为了生成帮助文档,会自动解析这个路径对应的模块,过程中会隐式导入test_package.myutils模块。一旦子模块被导入,就会被自动注册到test_package的属性列表里,之后再访问test_package.myutils就没问题了——说白了就是help帮你偷偷完成了子模块的导入操作。
解决办法
要让import test_package后直接能访问子模块,修改test_package/__init__.py文件,显式导入需要的子模块:
# test_package/__init__.py from . import myutils from . import module1
这样当你导入test_package时,会自动触发这些子模块的加载,子模块会被挂载为父模块的属性,就能直接用test_package.myutils.test_utils()调用了。
内容的提问来源于stack exchange,提问作者astroChance
相关产品推荐
相关产品推荐

