You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 22:15:57