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

为何不使用from导入时,Python无法找到模块中的子模块文件?

为何不使用from导入时,Python无法找到模块中的子模块文件?

这事儿我之前踩过坑,其实核心原因很简单:Python导入父模块时,并不会自动加载它的子模块,除非你明确触发子模块的加载操作。

咱们结合你的场景具体说:
你的文件夹结构是这样的:

C:
└── dev
    └── my_scripts
        ├── __init__.py
        └── my_utils.py

当你用第一种写法:

import sys
sys.path.append('C:\dev')
from my_scripts import my_utils
my_utils.f()

这里的from my_scripts import my_utils相当于直接告诉Python:“去把my_scripts里的my_utils子模块给我加载进来”,所以Python会定位到my_utils.py并加载它的内容,自然能找到函数f。

但换成第二种写法:

import sys
sys.path.append('C:\dev')
import my_scripts
my_scripts.my_utils.f()

import my_scripts这一步,Python只会去加载my_scripts目录下的__init__.py文件——这个文件是标识该目录为Python模块的关键,但它默认不会主动去扫描并加载目录里的其他子模块(比如my_utils.py)。这时候my_scripts模块的属性里根本没有my_utils,你直接调用自然会抛出AttributeError。

解决办法有两种:

  • 方法一:修改父模块的__init__.py
    在my_scripts/__init__.py里加上一行导入语句:
from . import my_utils

这样当你import my_scripts的时候,__init__.py会自动执行这个导入操作,把my_utils子模块加载到my_scripts的命名空间里,之后就能正常用my_scripts.my_utils.f()了。

  • 方法二:手动加载子模块
    在导入父模块之后,单独导入一次子模块:
import sys
sys.path.append('C:\dev')
import my_scripts
import my_scripts.my_utils  # 手动触发子模块加载
my_scripts.my_utils.f()

简单理解的话,就像你打开一个文件夹(父模块),里面的文件(子模块)不会自动出现在你的工作区,除非你特意去打开那个文件~

备注:内容来源于stack exchange,提问作者Daneel Olivaw

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:19:51