为何Python可从本地包导入模块,直接导入包后却无法访问模块?
Python包导入问题解析:为何
import project后无法访问内部模块? 核心原因
当你执行import project as proj时,Python仅会加载包根目录下的__init__.py文件(如果该文件存在),不会自动递归导入包内的所有子模块。此时proj对象对应的是project/__init__.py的模块实例,而load_data模块并没有被挂载到这个对象上,自然会抛出AttributeError。
而from project import load_data是直接指定导入load_data子模块,Python会加载该模块并将其绑定到当前命名空间,因此能正常调用其中的函数。
两种导入方式的本质区别
from project import load_data:明确触发project/load_data.py模块的加载,并将模块对象直接引入当前作用域。import project as proj:仅加载包本身(即执行__init__.py),包对象的属性完全由__init__.py中的定义决定,未显式导入的子模块不会成为包对象的属性。
解决办法
方法1:在__init__.py中显式导入子模块
在project/__init__.py中添加以下代码:
from . import load_data from . import analyse_data
这样当你import project as proj时,load_data和analyse_data模块会被自动加载并挂载到proj对象上,即可正常调用proj.load_data.function()。
方法2:手动加载子模块
如果不想修改__init__.py,可以在使用子模块前手动导入:
import project as proj import project.load_data # 显式加载子模块 proj.load_data.function()
方法3:定义__all__(辅助*导入,需配合显式导入)
在project/__init__.py中定义__all__列表:
__all__ = ['load_data', 'analyse_data']
这个配置主要用于控制from project import *时导入的内容,若要让proj.load_data可用,仍需在__init__.py中显式导入子模块。
内容的提问来源于stack exchange,提问作者taitlab
相关产品推荐
相关产品推荐

