为何不使用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
相关产品推荐
相关产品推荐

