Python导入子包提示‘no module named...’错误的路径疑问
场景描述
我已在默认Site Packages文件夹中安装了结构如下的包:
Site Packages |--packageA |----__init__.py |----sub-packageB |------__init__.py |------fileB1.py |----sub-packageC |------__init__.py |------fileC1.py
Site Packages已自动加入模块搜索路径,但在fileB1.py中执行import sub-packageB时,出现“no module named sub-packageB”错误,已知可通过from packageA import sub-packageB正常导入。
核心疑问
导入语句中首个模块/包所在的文件夹是否必须显式在模块搜索路径中?具体包括:
- 执行
import sub-packageB时,sub-packageB的路径是否需显式在搜索路径? - 执行
from sub-packageC import fileC1时,sub-packageC的路径是否需显式在搜索路径? - 执行
import packageA.sub-packageB时,packageA的路径是否需显式在搜索路径?
解答
核心规则
Python模块导入的核心逻辑是:导入语句中第一个出现的包/模块,它的直接父目录必须存在于模块搜索路径中。基于这个规则,逐个解答问题:
问题1:执行
import sub-packageB时,sub-packageB的路径是否需显式在搜索路径?
必须。当你直接写import sub-packageB时,Python会在模块搜索路径的顶层目录里查找sub-packageB。现在你的搜索路径只有Site Packages,而sub-packageB在Site Packages/packageA下面,不在搜索路径的直接目录中,所以Python找不到它,自然报错。问题2:执行
from sub-packageC import fileC1时,sub-packageC的路径是否需显式在搜索路径?
必须。和问题1逻辑一致,sub-packageC是导入语句的第一个包,它的父目录是packageA,而packageA不在搜索路径里(搜索路径是Site Packages),所以Python找不到sub-packageC,这种写法会报错。正确的写法应该是from packageA.sub-packageC import fileC1。问题3:执行
import packageA.sub-packageB时,packageA的路径是否需显式在搜索路径?
这里的“路径”指的是packageA的直接父目录——也就是Site Packages,而Site Packages已经在搜索路径里了,所以满足要求。Python会先在搜索路径中找到packageA,再逐层定位到它下面的sub-packageB,因此这个导入语句可以正常工作。
内容的提问来源于stack exchange,提问作者QuasiG

